First installment (just the #defines):

    (#define): Add _GNU_SOURCE.
Jan:  do not understand what this #define means.

It enables:

STRICT_ANSI, _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE,
_XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _LARGEFILE_SOURCE,
_LARGEFILE64_SOURCE, _FILE_OFFSET_BITS=N, _BSD_SOURCE, _SVID_SOURCE

but I swapped it out for:

#define _XOPEN_SOURCE 700

since that is supposed to give better portability.  Without either of
those defines, my compiler complains a lot about implicit fucntion
definitions.  However, that said, it will still link and run.
Thoughts?



Re complexity:

Jan: If they are not needed, they should be removed, and if they are
needed then there is a serious complexity problem.

I double checked and added comments for what all those includes are.
Seems I cannot reduce the number further.

#include <assert.h>    // assert in log_msg()
#include <libgen.h>    // 'basename'
#include <stdarg.h>    //  va_args
#include <stdio.h>
#include <stdlib.h>    // abort() and basename
#include <string.h>
#include <time.h>      //  time ops
#include <unistd.h>    //  for unlink (symlink)
#include <errno.h>     //  errorno for file opening
#include <dirent.h>     //  dir operations
#include <sys/stat.h>  // req for lstat    (symlink)
#include <fcntl.h>     // needed for file ops

Regards the symlink:

Jan: This all sound good, except the symlink, that is not going to work in
windows or IOS.

Can we put a compiler directive here since for unix systems, having
this service is actually very useful and saves a lot of user/dev time?

More to come soon,

G

On Sun, Aug 23, 2015 at 11:00 AM, jan i <[email protected]> wrote:
> Hi Gabriela
>
> Finally I got time to go in detail with your work. First thanks for making
> this important work.
>
> I have some comments to your latest commit:
>
> ---------- Forwarded message ----------
>
> "Add dedicated general logging macros, set a symlink 'current.log', and
> allow local custom log macros with dedicated names for the log file.
> Remove the tar file and use snprintf instead strncat and strdup."
>
> This all sound good, except the symlink, that is not going to work in
> windows or IOS.
>
>
>     (#define): Add _GNU_SOURCE.
> do not understand what this #define means.
>
>
>     (#include): Add "log_maker.h".
>                 Add <assert.h>.
>                 Add <error.h>.
>                 Add <libgen.h>.
>                 Add <stdarg.h>.
>                 Add <stdio.h>.
>                 Add <stdlib.h>.
>                 Add <string.h>.
>                 Add <time.h>.
>                 Add <unistd.h>.
>                 Add <errno.h>.
>                 Add <dirent.h>.
>                 Add <sys/types.h>.
>                 Add <sys/stat.h>.
>                 Add <fcntl.h>.
>       These are probably not all needed.
> If they are not needed, they should be removed, and if they are needed then
> there is a serious complexity problem.
>
>
>     (get_time_string): New function.
>
>     (set_log_output_function): New function.  This is a stub.
> I thought we agreed to make that part of log_init, I do not like it as an
> extra function.
>
>
>     (log_init): New function.  Create the logfile name with host, time
>       and program name. Set a symlink 'current.log' into
>       ~/../incubator/.
> the log_init function is given an output_function, it should NOT make any
> file operations.
>
> You should add a default_output_function, which you use if you get a NULL
> pointer in the log_init call.
>
>
>     (set_log_dir): New function.  Set the directory in which to write
>       the individual logfiles and the location where the symlonk
>       should be created.
> that is part of the output_function. Forget symlink, the program runs in a
> work-dir, and that is where the log files should go.
>
>
>     (close_log): New function.  Close the file descriptor and inform
>       user about the location and name of the generated file.
> I dont like this function, it adds complexity to the code, what happens if
> I call close_log, and then log a message.
>
> It is really not needed, close is done automatially when the program
> closes. In the output function you should use fflush() to secure
> all buffers are written to disk.
>
>     (log_msg_prefix): New function.  Create the prefix containing the
>       name of the log level, the file, line number and function name.
> I would assume that is part of the log_msg call, I do not like to see 2
> different calls.
>
>     (log_msg): New function. Write the log prefix and log message to
>       file.
>
>   * log_maker.h:
>
>     Header file for general inclusion so log_maker.c can be used.
>
>     (#ifndef): Add LOG_MAKER_H.
>       Header guard.  Somehow #pragma once does not work for me.
> Look at our other headers, there #pragma seems to work fine.
>
>     (#if): Add _MSC_VER.  Picked this up in the docs, apparently MSC
>       uses _sprintf instead.
>
> this is something that must go in dfplatform.h, we do not want to have MSC
> dependencies throughout the code.
>
>
>     (#define):  Add LOG_ERR.
>                 Add LOG_WARNING.
>                 Add LOG_NOTICE.
>                 Add LOG_INFO.
>                 Add LOG_DEBUG.
>         These are all strings for now.  I can change it back to numbers, but
>         currently those strings are used to print out the log message
> titles.
>
>     Global variables:
>
>     (char): Add log_filename[filename_len].
> that is the output_function and as such not the log code. If the output
> function uses a file, code outside logger must open that file.
>
>     (int): Add log_file_fd.  File descriptor for log file.
> Again output_function.
>
>     (static int log_level_initialised): Guard to prevent log_init from
>       being called twise.
>
>     (char): Add logging_dir[filename_len].
> no.
>
>     (char): Add log_symlink[filename_len].
> no.
>
>     (LOG_THIS): New function.  Basic macro, called by every custom macro.
>
>     Basic log macros for general usage:
>
>     (LOG_ERROR_MSG): New function.
>
>     (LOG_WARNING_MSG): New function.
>
>     (LOG_NOTICE_MSG): New function.
>
>     (LOG_INFO_MSG): New function.
>
>     (LOG_DEBUG_MSG): New function.
>
>     Prototypes for logmaker.c:
>
>     (set_log_output_function): New function.
> no part of log_init
>
>     (log_init): New function.
>
>     (set_log_dir): New function.
> no not used at all
>
>     (set_log_level): New function.
> no part of log_init
>
>     (close_log): New function.
> no
>
>     (log_msg_prefix): New function.
> I think this is part of log_msg
>
>
> Can we agree that on the outside logger has:
>
> log_init(<level>, <output_function> maybe other setup parms)
> log_msg(..) the function the macros call.
>
> LOG_FOO_MSG("text", ...)
>
> Not more!
>
> if log_init() is called with a NULL pointer for output_function, you use
> your own, that logs fixed to corinthia.log in currenct directory.
>
> rgds
> jan i.



-- 
Visit my Coding Diary: http://gabriela-gibson.blogspot.com/

Reply via email to