[PATCH] sysklogd: add -Z option to adjust message timezones
walter harms
wharms at bfs.de
Tue May 9 07:35:08 UTC 2017
Since this is a musl (only ?) feature i would suggest
to make that selectable.
re,
wh
Am 08.05.2017 23:45, schrieb Shiz:
> Some syslog() implementations like musl's[1] always send timestamps in UTC.
> This change adds a new option to syslogd, -Z, to assume incoming timestamps
> are always UTC and adjust them to the local timezone (of the syslogd) before
> logging.
>
> [1]: http://www.openwall.com/lists/musl/2014/01/29/1
>
> Signed-off-by: Shiz <hi at shiz.me>
> ---
> sysklogd/syslogd.c | 23 +++++++++++++++++++----
> 1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
> index d64ff27..159336e 100644
> --- a/sysklogd/syslogd.c
> +++ b/sysklogd/syslogd.c
> @@ -122,6 +122,7 @@
> //usage: "(this version of syslogd ignores /etc/syslog.conf)\n"
> //usage: )
> //usage: "\n -n Run in foreground"
> +//usage: "\n -Z Adjust incoming UTC times to local time"
> //usage: IF_FEATURE_REMOTE_LOG(
> //usage: "\n -R HOST[:PORT] Log to HOST:PORT (default PORT:514)"
> //usage: "\n -L Log locally and via network (default is network only if -R)"
> @@ -233,6 +234,8 @@ typedef struct logRule_t {
> /*int markInterval;*/ \
> /* level of messages to be logged */ \
> int logLevel; \
> + /* whether to adjust message timezone */\
> + int adjustTimezone; \
> IF_FEATURE_ROTATE_LOGFILE( \
> /* max size of file before rotation */ \
> unsigned logFileSize; \
> @@ -316,6 +319,7 @@ enum {
> OPTBIT_outfile, // -O
> OPTBIT_loglevel, // -l
> OPTBIT_small, // -S
> + OPTBIT_adjusttz, // -Z
> IF_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize ,) // -s
> IF_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt ,) // -b
> IF_FEATURE_REMOTE_LOG( OPTBIT_remotelog ,) // -R
> @@ -330,6 +334,7 @@ enum {
> OPT_outfile = 1 << OPTBIT_outfile ,
> OPT_loglevel = 1 << OPTBIT_loglevel,
> OPT_small = 1 << OPTBIT_small ,
> + OPT_adjusttz = 1 << OPTBIT_adjusttz,
> OPT_filesize = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize )) + 0,
> OPT_rotatecnt = IF_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt )) + 0,
> OPT_remotelog = IF_FEATURE_REMOTE_LOG( (1 << OPTBIT_remotelog )) + 0,
> @@ -339,7 +344,7 @@ enum {
> OPT_cfg = IF_FEATURE_SYSLOGD_CFG( (1 << OPTBIT_cfg )) + 0,
> OPT_kmsg = IF_FEATURE_KMSG_SYSLOG( (1 << OPTBIT_kmsg )) + 0,
> };
> -#define OPTION_STR "m:nO:l:S" \
> +#define OPTION_STR "m:nO:l:SZ" \
> IF_FEATURE_ROTATE_LOGFILE("s:" ) \
> IF_FEATURE_ROTATE_LOGFILE("b:" ) \
> IF_FEATURE_REMOTE_LOG( "R:*") \
> @@ -815,17 +820,23 @@ static void timestamp_and_log(int pri, char *msg, int len)
> {
> char *timestamp;
> time_t now;
> + struct tm nowtm = { .tm_isdst = 0 };
why ? is there a bug ?
>
> /* Jan 18 00:11:22 msg... */
> /* 01234567890123456 */
> if (len < 16 || msg[3] != ' ' || msg[6] != ' '
> || msg[9] != ':' || msg[12] != ':' || msg[15] != ' '
> ) {
> - time(&now);
> + now = time(NULL);
is the same
> timestamp = ctime(&now) + 4; /* skip day of week */
> } else {
> - now = 0;
> - timestamp = msg;
> + if (G.adjustTimezone && strptime(msg, "%b %e %T", &nowtm)) {
> + now = mktime(&nowtm) - timezone;
> + timestamp = ctime(&now) + 4; /* skip day of week */
> + } else {
> + now = 0;
> + timestamp = msg;
> + }
It is more easy to disable the feature if you do
now = 0;
timestamp = msg;
if (G.adjustTimezone && strptime(msg, "%b %e %T", &nowtm)) {
now = mktime(&nowtm) - timezone;
timestamp = ctime(&now) + 4; /* skip day of week */
}
just my 2 cents,
re,
wh
> msg += 16;
> }
> timestamp[15] = '\0';
> @@ -1130,6 +1141,10 @@ int syslogd_main(int argc UNUSED_PARAM, char **argv)
> if (opts & OPT_loglevel) // -l
> G.logLevel = xatou_range(opt_l, 1, 8);
> //if (opts & OPT_small) // -S
> + if (opts & OPT_adjusttz) { // -Z
> + G.adjustTimezone = 1;
> + tzset();
> + }
> #if ENABLE_FEATURE_ROTATE_LOGFILE
> if (opts & OPT_filesize) // -s
> G.logFileSize = xatou_range(opt_s, 0, INT_MAX/1024) * 1024;
More information about the busybox
mailing list