Just a follow up, I see log_msg(char* level, char* filename, int linenum, char *msg, ...)
{ if (level active) { snprintf(buffer, ".......", char* filename, int linenum, char *msg, ...) call output_function(buffer) } } I hope this explains a bit better how I think. rgds jan I. On 23 August 2015 at 12:00, jan i <j...@apache.org> 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. >