[openib-general] [PATCH] osm: Dynamic verbosity control per file
Hal Rosenstock
halr at voltaire.com
Wed Aug 30 06:30:19 PDT 2006
Hi again Yevgeny,
On Sun, 2006-08-27 at 07:30, Yevgeny Kliteynik wrote:
> Hi Hal.
>
> > > By default, the OSM will use the following file: /etc/opensmlog.conf
> >
> > Nit: For consistency in naming, this would be better as osmlog.conf
> > (or
> > osm-log.conf) rather than opensmlog.conf
>
> Right - will use osm-log.conf
>
> > Rather than remove osm_log and osm_log_raw, these should be
> > deprecated.
> > There are other applications outside of OpenSM (like osmtest and
> > others)
> > that need this.
>
> You're right, osm_log & osm_log_raw are no longer appear in the
> API, but they are not removed from headers - they are now macros,
> so the old code will still compile.
It's still an API change and old executables won't work with this new
opensm library.
> > Also, is this functionality needed for OFED 1.1 or is this trunk
> > only ?
>
> It doesn't have to get to 1.1.
> I'll send a second version of this patch that will address all your
> comments, including the addition in the osm man pages.
I see it. I'm still catching back up on my emails after vacation.
-- Hal
> Thanks,
>
> Yevgeny
>
> On Tue, 2006-08-15 at 18:34 +0300, Hal Rosenstock wrote:
>
> > Also, is this functionality needed for OFED 1.1 or is this trunk
> > only ?
> >
> > Thanks.
> >
> > -- Hal
> >
> > > 1. Verbosity configuration file
> > > --
> > >
> > > The user is able to set verbosity level per source code file
> > > by supplying verbosity configuration file using the following
> > > command line arguments:
> > >
> > > -b filename
> > > --verbosity_file filename
> > >
> > > By default, the OSM will use the following file: /etc/opensmlog.conf
> >
> > Nit: For consistency in naming, this would be better as osmlog.conf
> > (or
> > osm-log.conf) rather than opensmlog.conf
> >
> > > Verbosity configuration file should contain zero or more lines of
> > > the following pattern:
> > >
> > > filename verbosity_level
> > >
> > > where 'filename' is the name of the source code file that the
> > > 'verbosity_level' refers to, and the 'verbosity_level' itself
> > > should be specified as an integer number (decimal or hexadecimal).
> > >
> > > One reserved filename is 'all' - it represents general verbosity
> > > level, that is used for all the files that are not specified in
> > > the verbosity configuration file.
> > > If 'all' is not specified, the verbosity level set in the
> > > command line will be used instead.
> > > Note: The 'all' file verbosity level will override any other
> > > general level that was specified by the command line arguments.
> > >
> > > Sending a SIGHUP signal to the OSM will cause it to reload
> > > the verbosity configuration file.
> > >
> > >
> > > 2. Logging source code filename and line number
> > > --
> > >
> > > If command line option -S or --log_source_info is specified,
> > > OSM will add source code filename and line number to every
> > > log message that is written to the log file.
> > > By default, the OSM will not log this additional info.
> > >
> > >
> > > Yevgeny
> > >
> > > Signed-off-by: Yevgeny Kliteynik <kliteyn at mellanox.co.il>
> > >
> > > Index: include/opensm/osm_subnet.h
> > >
> > ===================================================================
> > > -- include/opensm/osm_subnet.h (revision 8614)
> > > +++ include/opensm/osm_subnet.h (working copy)
> > > @@ -285,6 +285,8 @@ typedef struct _osm_subn_opt
> > > osm_qos_options_t qos_sw0_options;
> > > osm_qos_options_t qos_swe_options;
> > > osm_qos_options_t qos_rtr_options;
> > > + boolean_t src_info;
> > > + char * verbosity_file;
> > > } osm_subn_opt_t;
> > > /*
> > > * FIELDS
> > > @@ -463,6 +465,27 @@ typedef struct _osm_subn_opt
> > > * qos_rtr_options
> > > * QoS options for router ports
> > > *
> > > +* src_info
> > > +* If TRUE - the source code filename and line number will
> > be
> > > +* added to each log message.
> > > +* Default value - FALSE.
> > > +*
> > > +* verbosity_file
> > > +* OSM log configuration file - the file that describes
> > > +* verbosity level per source code file.
> > > +* The file may containg zero or more lines of the following
> > > +* pattern:
> > > +* filename verbosity_level
> > > +* where 'filename' is the name of the source code file that
> > > +* the 'verbosity_level' refers to.
> > > +* Filename "all" represents general verbosity level, that
> > is
> > > +* used for all the files that are not specified in the
> > > +* verbosity file.
> > > +* If "all" is not specified, the general verbosity level
> > will
> > > +* be used instead.
> > > +* Note: the "all" file verbosity level will override any
> > other
> > > +* general level that was specified by the command line
> > > arguments.
> > > +*
> > > * SEE ALSO
> > > * Subnet object
> > > *********/
> > > Index: include/opensm/osm_base.h
> > >
> > ===================================================================
> > > -- include/opensm/osm_base.h (revision 8614)
> > > +++ include/opensm/osm_base.h (working copy)
> > > @@ -222,6 +222,22 @@ BEGIN_C_DECLS
> > > #endif
> > > /***********/
> > >
> > > +/****d* OpenSM: Base/OSM_DEFAULT_VERBOSITY_FILE
> > > +* NAME
> > > +* OSM_DEFAULT_VERBOSITY_FILE
> > > +*
> > > +* DESCRIPTION
> > > +* Specifies the default verbosity config file name
> > > +*
> > > +* SYNOPSIS
> > > +*/
> > > +#ifdef __WIN__
> > > +#define OSM_DEFAULT_VERBOSITY_FILE strcat(GetOsmPath(), "
> > > opensmlog.conf")
> > > +#else
> > > +#define OSM_DEFAULT_VERBOSITY_FILE "/etc/opensmlog.conf"
> > > +#endif
> > > +/***********/
> > > +
> > > /****d* OpenSM: Base/OSM_DEFAULT_PARTITION_CONFIG_FILE
> > > * NAME
> > > * OSM_DEFAULT_PARTITION_CONFIG_FILE
> > > Index: include/opensm/osm_log.h
> > > ===================================================================
> > > -- include/opensm/osm_log.h (revision 8652)
> > > +++ include/opensm/osm_log.h (working copy)
> > > @@ -57,6 +57,7 @@
> > > #include <complib/cl_log.h>
> > > #include <complib/cl_spinlock.h>
> > > #include <opensm/osm_base.h>
> > > +#include <opensm/st.h>
> > > #include <iba/ib_types.h>
> > > #include <stdio.h>
> > >
> > > @@ -123,9 +124,45 @@ typedef struct _osm_log
> > > cl_spinlock_t lock;
> > > boolean_t flush;
> > > FILE* out_port;
> > > + boolean_t src_info;
> > > + st_table * table;
> > > } osm_log_t;
> > > /*********/
> > >
> > > +/****f* OpenSM: Log/osm_log_read_verbosity_file
> > > +* NAME
> > > +* osm_log_read_verbosity_file
> > > +*
> > > +* DESCRIPTION
> > > +* This function reads the verbosity configuration file
> > > +* and constructs a verbosity data structure.
> > > +*
> > > +* SYNOPSIS
> > > +*/
> > > +void
> > > +osm_log_read_verbosity_file(
> > > + IN osm_log_t* p_log,
> > > + IN const char * const verbosity_file);
> > > +/*
> > > +* PARAMETERS
> > > +* p_log
> > > +* [in] Pointer to a Log object to construct.
> > > +*
> > > +* verbosity_file
> > > +* [in] verbosity configuration file
> > > +*
> > > +* RETURN VALUE
> > > +* None
> > > +*
> > > +* NOTES
> > > +* If the verbosity configuration file is not found, default
> > > +* verbosity value is used for all files.
> > > +* If there is an error in some line of the verbosity
> > > +* configuration file, the line is ignored.
> > > +*
> > > +*********/
> > > +
> > > +
> > > /****f* OpenSM: Log/osm_log_construct
> > > * NAME
> > > * osm_log_construct
> > > @@ -201,9 +238,13 @@ osm_log_destroy(
> > > * osm_log_init
> > > *********/
> > >
> > > -/****f* OpenSM: Log/osm_log_init
> > > +#define osm_log_init(p_log, flush, log_flags, log_file,
> > > accum_log_file) \
> > > + osm_log_init_ext(p_log, flush, (log_flags), log_file, \
> > > + accum_log_file, FALSE, OSM_DEFAULT_VERBOSITY_FILE)
> > > +
> > > +/****f* OpenSM: Log/osm_log_init_ext
> > > * NAME
> > > -* osm_log_init
> > > +* osm_log_init_ext
> > > *
> > > * DESCRIPTION
> > > * The osm_log_init function initializes a
> > > @@ -211,50 +252,15 @@ osm_log_destroy(
> > > *
> > > * SYNOPSIS
> > > */
> > > -static inline ib_api_status_t
> > > -osm_log_init(
> > > +ib_api_status_t
> > > +osm_log_init_ext(
> > > IN osm_log_t* const p_log,
> > > IN const boolean_t flush,
> > > IN const uint8_t log_flags,
> > > IN const char *log_file,
> > > - IN const boolean_t accum_log_file )
> > > -{
> > > - p_log->level = log_flags;
> > > - p_log->flush = flush;
> > > -
> > > - if (log_file == NULL || !strcmp(log_file, "-") ||
> > > - !strcmp(log_file, "stdout"))
> > > - {
> > > - p_log->out_port = stdout;
> > > - }
> > > - else if (!strcmp(log_file, "stderr"))
> > > - {
> > > - p_log->out_port = stderr;
> > > - }
> > > - else
> > > - {
> > > - if (accum_log_file)
> > > - p_log->out_port = fopen(log_file, "a+");
> > > - else
> > > - p_log->out_port = fopen(log_file, "w+");
> > > -
> > > - if (!p_log->out_port)
> > > - {
> > > - if (accum_log_file)
> > > - printf("Cannot open %s for appending. Permission denied
> > \n",
> > > log_file);
> > > - else
> > > - printf("Cannot open %s for writing. Permission denied\n",
> > > log_file);
> >
> > These lines above are line wrapped so they don't apply. This is an
> > email
> > issue on your side.
> >
> > > -
> > > - return(IB_UNKNOWN_ERROR);
> > > - }
> > > - }
> > > - openlog("OpenSM", LOG_CONS | LOG_PID, LOG_USER);
> > > -
> > > - if (cl_spinlock_init( &p_log->lock ) == CL_SUCCESS)
> > > - return IB_SUCCESS;
> > > - else
> > > - return IB_ERROR;
> > > -}
> > > + IN const boolean_t accum_log_file,
> > > + IN const boolean_t src_info,
> > > + IN const char *verbosity_file);
> > > /*
> > > * PARAMETERS
> > > * p_log
> > > @@ -271,6 +277,16 @@ osm_log_init(
> > > * log_file
> > > * [in] if not NULL defines the name of the log file. Otherwise
> > it
> > > is stdout.
> > > *
> > > +* accum_log_file
> > > +* [in] Whether the log file should be accumulated.
> > > +*
> > > +* src_info
> > > +* [in] Set to TRUE directs the log to add filename and line
> > > number
> > > +* to each log message.
> > > +*
> > > +* verbosity_file
> > > +* [in] Log configuration file location.
> > > +*
> > > * RETURN VALUES
> > > * CL_SUCCESS if the Log object was initialized
> > > * successfully.
> > > @@ -283,26 +299,32 @@ osm_log_init(
> > > * osm_log_destroy
> > > *********/
> > >
> > > -/****f* OpenSM: Log/osm_log_get_level
> > > +#define osm_log_get_level(p_log) \
> > > + osm_log_get_level_ext(p_log, __FILE__)
> > > +
> > > +/****f* OpenSM: Log/osm_log_get_level_ext
> > > * NAME
> > > -* osm_log_get_level
> > > +* osm_log_get_level_ext
> > > *
> > > * DESCRIPTION
> > > -* Returns the current log level.
> > > +* Returns the current log level for the file.
> > > +* If the file is not specified in the log config file,
> > > +* the general verbosity level will be returned.
> > > *
> > > * SYNOPSIS
> > > */
> > > -static inline osm_log_level_t
> > > -osm_log_get_level(
> > > - IN const osm_log_t* const p_log )
> > > -{
> > > - return( p_log->level );
> > > -}
> > > +osm_log_level_t
> > > +osm_log_get_level_ext(
> > > + IN const osm_log_t* const p_log,
> > > + IN const char* const p_filename );
> > > /*
> > > * PARAMETERS
> > > * p_log
> > > * [in] Pointer to the log object.
> > > *
> > > +* p_filename
> > > +* [in] Source code file name.
> > > +*
> > > * RETURN VALUES
> > > * Returns the current log level.
> > > *
> > > @@ -310,7 +332,7 @@ osm_log_get_level(
> > > *
> > > * SEE ALSO
> > > * Log object, osm_log_construct,
> > > -* osm_log_destroy
> > > +* osm_log_destroy, osm_log_get_level
> > > *********/
> > >
> > > /****f* OpenSM: Log/osm_log_set_level
> > > @@ -318,7 +340,7 @@ osm_log_get_level(
> > > * osm_log_set_level
> > > *
> > > * DESCRIPTION
> > > -* Sets the current log level.
> > > +* Sets the current general log level.
> > > *
> > > * SYNOPSIS
> > > */
> > > @@ -338,7 +360,7 @@ osm_log_set_level(
> > > * [in] New level to set.
> > > *
> > > * RETURN VALUES
> > > -* Returns the current log level.
> > > +* None.
> > > *
> > > * NOTES
> > > *
> > > @@ -347,9 +369,12 @@ osm_log_set_level(
> > > * osm_log_destroy
> > > *********/
> > >
> > > -/****f* OpenSM: Log/osm_log_is_active
> > > +#define osm_log_is_active(p_log, level) \
> > > + osm_log_is_active_ext(p_log, __FILE__, level)
> > > +
> > > +/****f* OpenSM: Log/osm_log_is_active_ext
> > > * NAME
> > > -* osm_log_is_active
> > > +* osm_log_is_active_ext
> > > *
> > > * DESCRIPTION
> > > * Returns TRUE if the specified log level would be logged.
> > > @@ -357,18 +382,19 @@ osm_log_set_level(
> > > *
> > > * SYNOPSIS
> > > */
> > > -static inline boolean_t
> > > -osm_log_is_active(
> > > +boolean_t
> > > +osm_log_is_active_ext(
> > > IN const osm_log_t* const p_log,
> > > - IN const osm_log_level_t level )
> > > -{
> > > - return( (p_log->level & level) != 0 );
> > > -}
> > > + IN const char* const p_filename,
> > > + IN const osm_log_level_t level );
> > > /*
> > > * PARAMETERS
> > > * p_log
> > > * [in] Pointer to the log object.
> > > *
> > > +* p_filename
> > > +* [in] Source code file name.
> > > +*
> > > * level
> > > * [in] Level to check.
> > > *
> > > @@ -383,17 +409,125 @@ osm_log_is_active(
> > > * osm_log_destroy
> > > *********/
> > >
> > > +
> > > +#define osm_log(p_log, verbosity, p_str, args...) \
> > > + osm_log_ext(p_log, verbosity, __FILE__, __LINE__, p_str , ##
> > > args)
> > > +
> > > +/****f* OpenSM: Log/osm_log_ext
> > > +* NAME
> > > +* osm_log_ext
> > > +*
> > > +* DESCRIPTION
> > > +* Logs the formatted specified message.
> > > +*
> > > +* SYNOPSIS
> > > +*/
> > > void
> > > -osm_log(
> > > +osm_log_ext(
> > > IN osm_log_t* const p_log,
> > > IN const osm_log_level_t verbosity,
> > > + IN const char *p_filename,
> > > + IN int line,
> > > IN const char *p_str, ... );
> > > +/*
> > > +* PARAMETERS
> > > +* p_log
> > > +* [in] Pointer to the log object.
> > > +*
> > > +* verbosity
> > > +* [in] Current message verbosity level
> > > +
> > > + p_filename
> > > + [in] Name of the file that is logging this message
> > > +
> > > + line
> > > + [in] Line number in the file that is logging this message
> > > +
> > > + p_str
> > > + [in] Format string of the message
> > > +*
> > > +* RETURN VALUES
> > > +* None.
> > > +*
> > > +* NOTES
> > > +*
> > > +* SEE ALSO
> > > +* Log object, osm_log_construct,
> > > +* osm_log_destroy
> > > +*********/
> > >
> > > +#define osm_log_raw(p_log, verbosity, p_buff) \
> > > + osm_log_raw_ext(p_log, verbosity, __FILE__, p_buff)
> > > +
> > > +/****f* OpenSM: Log/osm_log_raw_ext
> > > +* NAME
> > > +* osm_log_ext
> > > +*
> > > +* DESCRIPTION
> > > +* Logs the specified message.
> > > +*
> > > +* SYNOPSIS
> > > +*/
> > > void
> > > -osm_log_raw(
> > > +osm_log_raw_ext(
> > > IN osm_log_t* const p_log,
> > > IN const osm_log_level_t verbosity,
> > > + IN const char * p_filename,
> > > IN const char *p_buf );
> > > +/*
> > > +* PARAMETERS
> > > +* p_log
> > > +* [in] Pointer to the log object.
> > > +*
> > > +* verbosity
> > > +* [in] Current message verbosity level
> > > +
> > > + p_filename
> > > + [in] Name of the file that is logging this message
> > > +
> > > + p_buf
> > > + [in] Message string
> > > +*
> > > +* RETURN VALUES
> > > +* None.
> > > +*
> > > +* NOTES
> > > +*
> > > +* SEE ALSO
> > > +* Log object, osm_log_construct,
> > > +* osm_log_destroy
> > > +*********/
> > > +
> > > +
> > > +/****f* OpenSM: Log/osm_log_flush
> > > +* NAME
> > > +* osm_log_flush
> > > +*
> > > +* DESCRIPTION
> > > +* Flushes the log.
> > > +*
> > > +* SYNOPSIS
> > > +*/
> > > +static inline void
> > > +osm_log_flush(
> > > + IN osm_log_t* const p_log)
> > > +{
> > > + fflush(p_log->out_port);
> > > +}
> > > +/*
> > > +* PARAMETERS
> > > +* p_log
> > > +* [in] Pointer to the log object.
> > > +*
> > > +* RETURN VALUES
> > > +* None.
> > > +*
> > > +* NOTES
> > > +*
> > > +* SEE ALSO
> > > +*
> > > +*********/
> > > +
> > >
> > > #define DBG_CL_LOCK 0
> > >
> > > Index: opensm/osm_subnet.c
> > > ===================================================================
> > > -- opensm/osm_subnet.c (revision 8614)
> > > +++ opensm/osm_subnet.c (working copy)
> > > @@ -493,6 +493,8 @@ osm_subn_set_default_opt(
> > > p_opt->ucast_dump_file = NULL;
> > > p_opt->updn_guid_file = NULL;
> > > p_opt->exit_on_fatal = TRUE;
> > > + p_opt->src_info = FALSE;
> > > + p_opt->verbosity_file = OSM_DEFAULT_VERBOSITY_FILE;
> > > subn_set_default_qos_options(&p_opt->qos_options);
> > > subn_set_default_qos_options(&p_opt->qos_hca_options);
> > > subn_set_default_qos_options(&p_opt->qos_sw0_options);
> > > @@ -959,6 +961,13 @@ osm_subn_parse_conf_file(
> > > "honor_guid2lid_file",
> > > p_key, p_val, &p_opts->honor_guid2lid_file);
> > >
> > > + __osm_subn_opts_unpack_boolean(
> > > + "log_source_info",
> > > + p_key, p_val, &p_opts->src_info);
> > > +
> > > + __osm_subn_opts_unpack_charp(
> > > + "verbosity_file", p_key, p_val, &p_opts->verbosity_file);
> > > +
> > > subn_parse_qos_options("qos",
> > > p_key, p_val, &p_opts->qos_options);
> > >
> > > @@ -1182,7 +1191,11 @@ osm_subn_write_conf_file(
> > > "# No multicast routing is performed if TRUE\n"
> > > "disable_multicast %s\n\n"
> > > "# If TRUE opensm will exit on fatal initialization issues\n"
> > > - "exit_on_fatal %s\n\n",
> > > + "exit_on_fatal %s\n\n"
> > > + "# If TRUE OpenSM will log filename and line numbers\n"
> > > + "log_source_info %s\n\n"
> > > + "# Verbosity configuration file to be used\n"
> > > + "verbosity_file %s\n\n",
> > > p_opts->log_flags,
> > > p_opts->force_log_flush ? "TRUE" : "FALSE",
> > > p_opts->log_file,
> > > @@ -1190,7 +1203,9 @@ osm_subn_write_conf_file(
> > > p_opts->dump_files_dir,
> > > p_opts->no_multicast_option ? "TRUE" : "FALSE",
> > > p_opts->disable_multicast ? "TRUE" : "FALSE",
> > > - p_opts->exit_on_fatal ? "TRUE" : "FALSE"
> > > + p_opts->exit_on_fatal ? "TRUE" : "FALSE",
> > > + p_opts->src_info ? "TRUE" : "FALSE",
> > > + p_opts->verbosity_file
> > > );
> > >
> > > fprintf(
> > > Index: opensm/osm_opensm.c
> > > ===================================================================
> > > -- opensm/osm_opensm.c (revision 8614)
> > > +++ opensm/osm_opensm.c (working copy)
> > > @@ -180,8 +180,10 @@ osm_opensm_init(
> > > /* Can't use log macros here, since we're initializing the log.
> > */
> > > osm_opensm_construct( p_osm );
> > >
> > > - status = osm_log_init( &p_osm->log, p_opt->force_log_flush,
> > > - p_opt->log_flags, p_opt->log_file,
> > > p_opt->accum_log_file );
> > > + status = osm_log_init_ext( &p_osm->log, p_opt->force_log_flush,
> > > + p_opt->log_flags, p_opt->log_file,
> > > + p_opt->accum_log_file, p_opt->src_info,
> > > + p_opt->verbosity_file);
> > > if( status != IB_SUCCESS )
> > > return ( status );
> > >
> > > Index: opensm/libopensm.map
> > >
> > ===================================================================
> > > -- opensm/libopensm.map (revision 8614)
> > > +++ opensm/libopensm.map (working copy)
> > > @@ -1,6 +1,11 @@
> > > -OPENSM_1.0 {
> > > +OPENSM_2.0 {
> > > global:
> > > - osm_log;
> > > + osm_log_init_ext;
> > > + osm_log_ext;
> > > + osm_log_raw_ext;
> > > + osm_log_get_level_ext;
> > > + osm_log_is_active_ext;
> > > + osm_log_read_verbosity_file;
> > > osm_is_debug;
> > > osm_mad_pool_construct;
> > > osm_mad_pool_destroy;
> > > @@ -39,7 +44,6 @@ OPENSM_1.0 {
> > > osm_dump_dr_path;
> > > osm_dump_smp_dr_path;
> > > osm_dump_pkey_block;
> > > - osm_log_raw;
> > > osm_get_sm_state_str;
> > > osm_get_sm_signal_str;
> > > osm_get_disp_msg_str;
> >
> > Rather than remove osm_log and osm_log_raw, these should be
> > deprecated.
> > There are other applications outside of OpenSM (like osmtest and
> > others)
> > that need this.
> >
> > > @@ -51,5 +55,11 @@ OPENSM_1.0 {
> > > osm_get_lsa_str;
> > > osm_get_sm_mgr_signal_str;
> > > osm_get_sm_mgr_state_str;
> > > + st_init_strtable;
> > > + st_delete;
> > > + st_insert;
> > > + st_lookup;
> > > + st_foreach;
> > > + st_free_table;
> > > local: *;
> > > };
> > > Index: opensm/osm_log.c
> > > ===================================================================
> > > -- opensm/osm_log.c (revision 8614)
> > > +++ opensm/osm_log.c (working copy)
> > > @@ -80,17 +80,365 @@ static char *month_str[] = {
> > > };
> > > #endif /* ndef WIN32 */
> > >
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +#define OSM_VERBOSITY_ALL "all"
> > > +
> > > +static void
> > > +__osm_log_free_verbosity_table(
> > > + IN osm_log_t* p_log);
> > > +static void
> > > +__osm_log_print_verbosity_table(
> > > + IN osm_log_t* const p_log);
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +osm_log_level_t
> > > +osm_log_get_level_ext(
> > > + IN const osm_log_t* const p_log,
> > > + IN const char* const p_filename )
> > > +{
> > > + osm_log_level_t * p_curr_file_level = NULL;
> > > +
> > > + if (!p_filename || !p_log->table)
> > > + return p_log->level;
> > > +
> > > + if ( st_lookup( p_log->table,
> > > + (st_data_t) p_filename,
> > > + (st_data_t*) &p_curr_file_level) )
> > > + return *p_curr_file_level;
> > > + else
> > > + return p_log->level;
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +ib_api_status_t
> > > +osm_log_init_ext(
> > > + IN osm_log_t* const p_log,
> > > + IN const boolean_t flush,
> > > + IN const uint8_t log_flags,
> > > + IN const char *log_file,
> > > + IN const boolean_t accum_log_file,
> > > + IN const boolean_t src_info,
> > > + IN const char *verbosity_file)
> > > +{
> > > + p_log->level = log_flags;
> > > + p_log->flush = flush;
> > > + p_log->src_info = src_info;
> > > + p_log->table = NULL;
> > > +
> > > + if (log_file == NULL || !strcmp(log_file, "-") ||
> > > + !strcmp(log_file, "stdout"))
> > > + {
> > > + p_log->out_port = stdout;
> > > + }
> > > + else if (!strcmp(log_file, "stderr"))
> > > + {
> > > + p_log->out_port = stderr;
> > > + }
> > > + else
> > > + {
> > > + if (accum_log_file)
> > > + p_log->out_port = fopen(log_file, "a+");
> > > + else
> > > + p_log->out_port = fopen(log_file, "w+");
> > > +
> > > + if (!p_log->out_port)
> > > + {
> > > + if (accum_log_file)
> > > + printf("Cannot open %s for appending. Permission denied
> > \n",
> > > log_file);
> > > + else
> > > + printf("Cannot open %s for writing. Permission denied\n",
> > > log_file);
> > > +
> > > + return(IB_UNKNOWN_ERROR);
> > > + }
> > > + }
> > > + openlog("OpenSM", LOG_CONS | LOG_PID, LOG_USER);
> > > +
> > > + if (cl_spinlock_init( &p_log->lock ) != CL_SUCCESS)
> > > + return IB_ERROR;
> > > +
> > > + osm_log_read_verbosity_file(p_log,verbosity_file);
> > > + return IB_SUCCESS;
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +void
> > > +osm_log_read_verbosity_file(
> > > + IN osm_log_t* p_log,
> > > + IN const char * const verbosity_file)
> > > +{
> > > + FILE *infile;
> > > + char line[500];
> > > + struct stat buf;
> > > + boolean_t table_empty = TRUE;
> > > + char * tmp_str = NULL;
> > > +
> > > + if (p_log->table)
> > > + {
> > > + /*
> > > + * Free the existing table.
> > > + * Note: if the verbosity config file will not be found,
> > this
> > > will
> > > + * effectivly reset the existing verbosity configuration and
> > > set
> > > + * all the files to the same verbosity level
> > > + */
> > > + __osm_log_free_verbosity_table(p_log);
> > > + }
> > > +
> > > + if (!verbosity_file)
> > > + return;
> > > +
> > > + if ( stat(verbosity_file, &buf) != 0 )
> > > + {
> > > + /*
> > > + * Verbosity configuration file doesn't exist.
> > > + */
> > > + if (strcmp(verbosity_file,OSM_DEFAULT_VERBOSITY_FILE) == 0)
> > > + {
> > > + /*
> > > + * Verbosity configuration file wasn't explicitly
> > specified.
> > > + * No need to issue any error message.
> > > + */
> > > + return;
> > > + }
> > > + else
> > > + {
> > > + /*
> > > + * Verbosity configuration file was explicitly specified.
> > > + */
> > > + osm_log(p_log, OSM_LOG_SYS,
> > > + "ERROR: Verbosity configuration file (%s) doesn't
> > > exist.\n",
> > > + verbosity_file);
> > > + osm_log(p_log, OSM_LOG_SYS,
> > > + " Using general verbosity value.\n");
> > > + return;
> > > + }
> > > + }
> > > +
> > > + infile = fopen(verbosity_file, "r");
> > > + if ( infile == NULL )
> > > + {
> > > + osm_log(p_log, OSM_LOG_SYS,
> > > + "ERROR: Failed opening verbosity configuration file
> > > (%s).\n",
> > > + verbosity_file);
> > > + osm_log(p_log, OSM_LOG_SYS,
> > > + " Using general verbosity value.\n");
> > > + return;
> > > + }
> > > +
> > > + p_log->table = st_init_strtable();
> > > + if (p_log->table == NULL)
> > > + {
> > > + osm_log(p_log, OSM_LOG_SYS, "ERROR: Verbosity table
> > > initialization failed.\n");
> > > + return;
> > > + }
> > > +
> > > + /*
> > > + * Read the file line by line, parse the lines, and
> > > + * add each line to p_log->table.
> > > + */
> > > + while ( fgets(line, sizeof(line), infile) != NULL )
> > > + {
> > > + char * str = line;
> > > + char * name = NULL;
> > > + char * value = NULL;
> > > + osm_log_level_t * p_log_level_value = NULL;
> > > + int res;
> > > +
> > > + name = strtok_r(str," \t\n",&tmp_str);
> > > + if (name == NULL || strlen(name) == 0) {
> > > + /*
> > > + * empty line - ignore it
> > > + */
> > > + continue;
> > > + }
> > > + value = strtok_r(NULL," \t\n",&tmp_str);
> > > + if (value == NULL || strlen(value) == 0)
> > > + {
> > > + /*
> > > + * No verbosity value - wrong syntax.
> > > + * This line will be ignored.
> > > + */
> > > + continue;
> > > + }
> > > +
> > > + /*
> > > + * If the conversion will fail, the log_level_value will get
> > 0,
> > > + * so the only way to check that the syntax is correct is to
> > > + * scan value for any non-digit (which we're not doing
> > here).
> > > + */
> > > + p_log_level_value = malloc (sizeof(osm_log_level_t));
> > > + if (!p_log_level_value)
> > > + {
> > > + osm_log(p_log, OSM_LOG_SYS, "ERROR: malloc failed.\n");
> > > + p_log->table = NULL;
> > > + fclose(infile);
> > > + return;
> > > + }
> > > + *p_log_level_value = strtoul(value, NULL, 0);
> > > +
> > > + if (strcasecmp(name,OSM_VERBOSITY_ALL) == 0)
> > > + {
> > > + osm_log_set_level(p_log, *p_log_level_value);
> > > + free(p_log_level_value);
> > > + }
> > > + else
> > > + {
> > > + res = st_insert( p_log->table,
> > > + (st_data_t) strdup(name),
> > > + (st_data_t) p_log_level_value);
> > > + if (res != 0)
> > > + {
> > > + /*
> > > + * Something is wrong with the verbosity table.
> > > + * We won't try to free the table, because there's
> > > + * clearly something corrupted there.
> > > + */
> > > + osm_log(p_log, OSM_LOG_SYS, "ERROR: Failed adding
> > > verbosity table element.\n");
> > > + p_log->table = NULL;
> > > + fclose(infile);
> > > + return;
> > > + }
> > > + table_empty = FALSE;
> > > + }
> > > +
> > > + }
> > > +
> > > + if (table_empty)
> > > + __osm_log_free_verbosity_table(p_log);
> > > +
> > > + fclose(infile);
> > > +
> > > + __osm_log_print_verbosity_table(p_log);
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +static int
> > > +__osm_log_print_verbosity_table_element(
> > > + IN st_data_t key,
> > > + IN st_data_t val,
> > > + IN st_data_t arg)
> > > +{
> > > + osm_log( (osm_log_t* const) arg,
> > > + OSM_LOG_INFO,
> > > + "[verbosity] File: %s, Level: 0x%x\n",
> > > + (char *) key, *((osm_log_level_t *) val));
> > > +
> > > + return ST_CONTINUE;
> > > +}
> > > +
> > > +static void
> > > +__osm_log_print_verbosity_table(
> > > + IN osm_log_t* const p_log)
> > > +{
> > > + osm_log( p_log, OSM_LOG_INFO,
> > > + "[verbosity] Verbosity table loaded\n" );
> > > + osm_log( p_log, OSM_LOG_INFO,
> > > + "[verbosity] General level:
> > > 0x%x\n",osm_log_get_level_ext(p_log,NULL));
> > > +
> > > + if (p_log->table)
> > > + {
> > > + st_foreach( p_log->table,
> > > + __osm_log_print_verbosity_table_element,
> > > + (st_data_t) p_log );
> > > + }
> > > + osm_log_flush(p_log);
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +static int
> > > +__osm_log_free_verbosity_table_element(
> > > + IN st_data_t key,
> > > + IN st_data_t val,
> > > + IN st_data_t arg)
> > > +{
> > > + free( (char *) key );
> > > + free( (osm_log_level_t *) val );
> > > + return ST_DELETE;
> > > +}
> > > +
> > > +static void
> > > +__osm_log_free_verbosity_table(
> > > + IN osm_log_t* p_log)
> > > +{
> > > + if (!p_log->table)
> > > + return;
> > > +
> > > + st_foreach( p_log->table,
> > > + __osm_log_free_verbosity_table_element,
> > > + (st_data_t) NULL);
> > > +
> > > + st_free_table(p_log->table);
> > > + p_log->table = NULL;
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +static inline const char *
> > > +__osm_log_get_base_name(
> > > + IN const char * const p_filename)
> > > +{
> > > +#ifdef WIN32
> > > + char dir_separator = '\\';
> > > +#else
> > > + char dir_separator = '/';
> > > +#endif
> > > + char * tmp_ptr;
> > > +
> > > + if (!p_filename)
> > > + return NULL;
> > > +
> > > + tmp_ptr = strrchr(p_filename,dir_separator);
> > > +
> > > + if (!tmp_ptr)
> > > + return p_filename;
> > > + return tmp_ptr+1;
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > +boolean_t
> > > +osm_log_is_active_ext(
> > > + IN const osm_log_t* const p_log,
> > > + IN const char* const p_filename,
> > > + IN const osm_log_level_t level )
> > > +{
> > > + osm_log_level_t tmp_lvl;
> > > + tmp_lvl = level &
> > > +
> > > osm_log_get_level_ext(p_log,__osm_log_get_base_name(p_filename));
> > > + return ( tmp_lvl != 0 );
> > > +}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > static int log_exit_count = 0;
> > >
> > > void
> > > -osm_log(
> > > +osm_log_ext(
> > > IN osm_log_t* const p_log,
> > > IN const osm_log_level_t verbosity,
> > > + IN const char *p_filename,
> > > + IN int line,
> > > IN const char *p_str, ... )
> > > {
> > > char buffer[LOG_ENTRY_SIZE_MAX];
> > > va_list args;
> > > int ret;
> > > + osm_log_level_t file_verbosity;
> > >
> > > #ifdef WIN32
> > > SYSTEMTIME st;
> > > @@ -108,69 +456,89 @@ osm_log(
> > > localtime_r(&tim, &result);
> > > #endif /* WIN32 */
> > >
> > > - /* If this is a call to syslog - always print it */
> > > - if ( verbosity & OSM_LOG_SYS )
> > > + /*
> > > + * Extract only the file name out of the full path
> > > + */
> > > + p_filename = __osm_log_get_base_name(p_filename);
> > > + /*
> > > + * Get the verbosity level for this file.
> > > + * If the file is not specified in the log config file,
> > > + * the general verbosity level will be returned.
> > > + */
> > > + file_verbosity = osm_log_get_level_ext(p_log, p_filename);
> > > +
> > > + if ( ! (verbosity & OSM_LOG_SYS) &&
> > > + ! (file_verbosity & verbosity) )
> > > {
> > > - /* this is a call to the syslog */
> > > + /*
> > > + * This is not a syslog message (which is always printed)
> > > + * and doesn't have the required verbosity level.
> > > + */
> > > + return;
> > > + }
> > > +
> > > va_start( args, p_str );
> > > vsprintf( buffer, p_str, args );
> > > va_end(args);
> > > - cl_log_event("OpenSM", LOG_INFO, buffer , NULL, 0);
> > >
> > > +
> > > + if ( verbosity & OSM_LOG_SYS )
> > > + {
> > > + /* this is a call to the syslog */
> > > + cl_log_event("OpenSM", LOG_INFO, buffer , NULL, 0);
> > > /* SYSLOG should go to stdout too */
> > > if (p_log->out_port != stdout)
> > > {
> > > - printf("%s\n", buffer);
> > > + printf("%s", buffer);
> > > fflush( stdout );
> > > }
> > > + }
> > > + /* SYSLOG also goes to to the log file */
> > > +
> > > + cl_spinlock_acquire( &p_log->lock );
> > >
> > > - /* send it also to the log file */
> > > #ifdef WIN32
> > > GetLocalTime(&st);
> > > - fprintf( p_log->out_port, "[%02d:%02d:%02d:%03d][%04X] -> %
> > s",
> > > + if (p_log->src_info)
> > > + {
> > > + ret = fprintf( p_log->out_port, "[%02d:%02d:%02d:%03d][%04X]
> > > [%s:%d] -> %s",
> > > st.wHour, st.wMinute, st.wSecond,
> > > st.wMilliseconds,
> > > - pid, buffer);
> > > -#else
> > > - fprintf( p_log->out_port, "%s %02d %02d:%02d:%02d %06d [%04X]
> > ->
> > > %s\n",
> > > - (result.tm_mon < 12 ? month_str[result.tm_mon] :
> > "???"),
> > > - result.tm_mday, result.tm_hour,
> > > - result.tm_min, result.tm_sec,
> > > - usecs, pid, buffer);
> > > - fflush( p_log->out_port );
> > > -#endif
> > > + pid, p_filename, line, buffer);
> > > }
> > > -
> > > - /* SYS messages go to the log anyways */
> > > - if (p_log->level & verbosity)
> > > + else
> > > {
> > > -
> > > - va_start( args, p_str );
> > > - vsprintf( buffer, p_str, args );
> > > - va_end(args);
> > > -
> > > - /* regular log to default out_port */
> > > - cl_spinlock_acquire( &p_log->lock );
> > > -#ifdef WIN32
> > > - GetLocalTime(&st);
> > > ret = fprintf( p_log->out_port, "[%02d:%02d:%02d:%03d][%04X]
> > ->
> > > %s",
> > > st.wHour, st.wMinute, st.wSecond,
> > > st.wMilliseconds,
> > > pid, buffer);
> > > -
> > > + }
> > > #else
> > > pid = pthread_self();
> > > tim = time(NULL);
> > > + if (p_log->src_info)
> > > + {
> > > + ret = fprintf( p_log->out_port, "%s %02d %02d:%02d:%02d %06d
> > > [%04X] [%s:%d] -> %s",
> > > + ((result.tm_mon < 12) && (result.tm_mon >=
> > 0) ?
> > > + month_str[ result.tm_mon] : "???"),
> > > + result.tm_mday, result.tm_hour,
> > > + result.tm_min, result.tm_sec,
> > > + usecs, pid, p_filename, line, buffer);
> > > + }
> > > + else
> > > + {
> > > ret = fprintf( p_log->out_port, "%s %02d %02d:%02d:%02d %06d
> > > [%04X] -> %s",
> > > ((result.tm_mon < 12) && (result.tm_mon >=
> > 0) ?
> > > month_str[ result.tm_mon] : "???"),
> > > result.tm_mday, result.tm_hour,
> > > result.tm_min, result.tm_sec,
> > > usecs, pid, buffer);
> > > -#endif /* WIN32 */
> > > -
> > > + }
> > > +#endif
> > > /*
> > > - Flush log on errors too.
> > > + * Flush log on errors and SYSLOGs too.
> > > */
> > > - if( p_log->flush || (verbosity & OSM_LOG_ERROR) )
> > > + if ( p_log->flush ||
> > > + (verbosity & OSM_LOG_ERROR) ||
> > > + (verbosity & OSM_LOG_SYS) )
> > > fflush( p_log->out_port );
> > >
> > > cl_spinlock_release( &p_log->lock );
> > > @@ -183,15 +551,30 @@ osm_log(
> > > }
> > > }
> > > }
> > > -}
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > >
> > > void
> > > -osm_log_raw(
> > > +osm_log_raw_ext(
> > > IN osm_log_t* const p_log,
> > > IN const osm_log_level_t verbosity,
> > > + IN const char * p_filename,
> > > IN const char *p_buf )
> > > {
> > > - if( p_log->level & verbosity )
> > > + osm_log_level_t file_verbosity;
> > > + /*
> > > + * Extract only the file name out of the full path
> > > + */
> > > + p_filename = __osm_log_get_base_name(p_filename);
> > > + /*
> > > + * Get the verbosity level for this file.
> > > + * If the file is not specified in the log config file,
> > > + * the general verbosity level will be returned.
> > > + */
> > > + file_verbosity = osm_log_get_level_ext(p_log, p_filename);
> > > +
> > > + if ( file_verbosity & verbosity )
> > > {
> > > cl_spinlock_acquire( &p_log->lock );
> > > printf( "%s", p_buf );
> > > @@ -205,6 +588,9 @@ osm_log_raw(
> > > }
> > > }
> > >
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > boolean_t
> > > osm_is_debug(void)
> > > {
> > > @@ -214,3 +600,7 @@ osm_is_debug(void)
> > > return FALSE;
> > > #endif /* defined( _DEBUG_ ) */
> > > }
> > > +
> > >
> > +/***************************************************************************
> > > +
> > >
> > ***************************************************************************/
> > > +
> > > Index: opensm/main.c
> > >
> > ===================================================================
> > > -- opensm/main.c (revision 8652)
> > > +++ opensm/main.c (working copy)
> > > @@ -296,6 +296,33 @@ show_usage(void)
> > > " -d3 - Disable multicast support\n"
> > > " -d10 - Put OpenSM in testability mode\n"
> > > " Without -d, no debug options are enabled\n
> > \n" );
> > > + printf( "-S\n"
> > > + "--log_source_info\n"
> > > + " This option tells SM to add source code
> > > filename\n"
> > > + " and line number to every log message.\n"
> > > + " By default, the SM will not log this
> > additional
> > > info.\n\n");
> > > + printf( "-b\n"
> > > + "--verbosity_file <file name>\n"
> > > + " This option specifies name of the verbosity
> > \n"
> > > + " configuration file, which describes verbosity
> > > level\n"
> > > + " per source code file. The file may contain
> > zero
> > > or\n"
> > > + " more lines of the following pattern:\n"
> > > + " filename verbosity_level\n"
> > > + " where 'filename' is the name of the source
> > code
> > > file\n"
> > > + " that the 'verbosity_level' refers to, and the
> > > \n"
> > > + " 'verbosity_level' itself should be specified
> > as
> > > a\n"
> > > + " number (decimal or hexadecimal).\n"
> > > + " Filename 'all' represents general verbosity
> > > level,\n"
> > > + " that is used for all the files that are not
> > > specified\n"
> > > + " in the verbosity file.\n"
> > > + " Note: The 'all' file verbosity level will
> > > override any\n"
> > > + " other general level that was specified by the
> > > command\n"
> > > + " line arguments.\n"
> > > + " By default, the SM will use the following
> > > file:\n"
> > > + " %s\n"
> > > + " Sending a SIGHUP signal to the SM will cause
> > it
> > > to\n"
> > > + " re-read the verbosity configuration file.\n"
> > > + "\n\n", OSM_DEFAULT_VERBOSITY_FILE);
> > > printf( "-h\n"
> > > "--help\n"
> > > " Display this usage info then exit.\n\n" );
> > > @@ -527,7 +554,7 @@ main(
> > > boolean_t cache_options = FALSE;
> > > char *ignore_guids_file_name = NULL;
> > > uint32_t val;
> > > - const char * const short_option =
> > > "i:f:ed:g:l:s:t:a:R:U:P:NQvVhorcyx";
> > > + const char * const short_option =
> > > "i:f:ed:g:l:s:t:a:R:U:P:b:SNQvVhorcyx";
> > >
> > > /*
> > > In the array below, the 2nd parameter specified the number
> > > @@ -565,6 +592,8 @@ main(
> > > { "cache-options", 0, NULL, 'c'},
> > > { "stay_on_fatal", 0, NULL, 'y'},
> > > { "honor_guid2lid", 0, NULL, 'x'},
> > > + { "log_source_info",0,NULL, 'S'},
> > > + { "verbosity_file",1, NULL, 'b'},
> > > { NULL, 0, NULL, 0 } /* Required at the end of
> > > the array */
> > > };
> > >
> > > @@ -808,6 +837,16 @@ main(
> > > printf (" Honor guid2lid file, if possible\n");
> > > break;
> > >
> > > + case 'S':
> > > + opt.src_info = TRUE;
> > > + printf(" Logging source code filename and line number\n");
> > > + break;
> > > +
> > > + case 'b':
> > > + opt.verbosity_file = optarg;
> > > + printf(" Verbosity Configuration File: %s\n", optarg);
> > > + break;
> > > +
> > > case 'h':
> > > case '?':
> > > case ':':
> > > @@ -920,9 +959,13 @@ main(
> > >
> > > if (osm_hup_flag) {
> > > osm_hup_flag = 0;
> > > - /* a HUP signal should only start a new heavy sweep */
> > > + /*
> > > + * A HUP signal should cause OSM to re-read the log
> > > + * configuration file and start a new heavy sweep
> > > + */
> > > osm.subn.force_immediate_heavy_sweep = TRUE;
> > > osm_opensm_sweep( &osm );
> > > + osm_log_read_verbosity_file(&osm.log,opt.verbosity_file);
> > > }
> > > }
> > > }
> > > Index: opensm/Makefile.am
> > > ===================================================================
> > > -- opensm/Makefile.am (revision 8614)
> > > +++ opensm/Makefile.am (working copy)
> > > @@ -43,7 +43,7 @@ else
> > > libopensm_version_script =
> > > endif
> > >
> > > -libopensm_la_SOURCES = osm_log.c osm_mad_pool.c osm_helper.c
> > > +libopensm_la_SOURCES = osm_log.c osm_mad_pool.c osm_helper.c st.c
> > > libopensm_la_LDFLAGS = -version-info $(opensm_api_version) \
> > > -export-dynamic $(libopensm_version_script)
> > > libopensm_la_DEPENDENCIES = $(srcdir)/libopensm.map
> > > @@ -90,7 +90,7 @@ opensm_SOURCES = main.c osm_console.c os
> > > osm_trap_rcv.c osm_trap_rcv_ctrl.c \
> > > osm_ucast_mgr.c osm_ucast_updn.c osm_ucast_file.c \
> > > osm_vl15intf.c osm_vl_arb_rcv.c \
> > > - osm_vl_arb_rcv_ctrl.c st.c
> > > + osm_vl_arb_rcv_ctrl.c
> > > if OSMV_OPENIB
> > > opensm_CFLAGS = -Wall $(OSMV_CFLAGS) -fno-strict-aliasing
> > > -DVENDOR_RMPP_SUPPORT -DDUAL_SIDED_RMPP $(DBGFLAGS)
> > > -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1
> > > opensm_CXXFLAGS = -Wall $(OSMV_CFLAGS) -DVENDOR_RMPP_SUPPORT
> > > -DDUAL_SIDED_RMPP $(DBGFLAGS) -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1
> > > Index: doc/verbosity-config.txt
> > > ===================================================================
> > > -- doc/verbosity-config.txt (revision 0)
> > > +++ doc/verbosity-config.txt (revision 0)
> > > @@ -0,0 +1,43 @@
> > > +
> > > +This patch adds new verbosity functionality.
> > > +
> > > +1. Verbosity configuration file
> > > +--
> > > +
> > > +The user is able to set verbosity level per source code file
> > > +by supplying verbosity configuration file using the following
> > > +command line arguments:
> > > +
> > > + -b filename
> > > + --verbosity_file filename
> > > +
> > > +By default, the OSM will use the following
> > file: /etc/opensmlog.conf
> > > +Verbosity configuration file should contain zero or more lines of
> > > +the following pattern:
> > > +
> > > + filename verbosity_level
> > > +
> > > +where 'filename' is the name of the source code file that the
> > > +'verbosity_level' refers to, and the 'verbosity_level' itself
> > > +should be specified as an integer number (decimal or
> > hexadecimal).
> > > +
> > > +One reserved filename is 'all' - it represents general verbosity
> > > +level, that is used for all the files that are not specified in
> > > +the verbosity configuration file.
> > > +If 'all' is not specified, the verbosity level set in the
> > > +command line will be used instead.
> > > +Note: The 'all' file verbosity level will override any other
> > > +general level that was specified by the command line arguments.
> > > +
> > > +Sending a SIGHUP signal to the OSM will cause it to reload
> > > +the verbosity configuration file.
> > > +
> > > +
> > > +2. Logging source code filename and line number
> > > +--
> > > +
> > > +If command line option -S or --log_source_info is specified,
> > > +OSM will add source code filename and line number to every
> > > +log message that is written to the log file.
> > > +By default, the OSM will not log this additional info.
> > > +
> > >
> > >
More information about the general
mailing list