2011-11-25 83 views
4

我有一个bash脚本,我需要从中写入日志。目前我使用如下所示的块在Bash脚本中使用日志记录

#log stop request 
      { 
       local now=$(date +"%a %b %d %Y %H:%M:%S") 

       printf "batch stop request successful. \n" 
       printf "  Time   :: %s\n" "$now" 
       printf "  PID of process :: %s\n" ${PID[0]}" 
      } >> "${mylogfile}" 

其中mylogfile变量将具有日志文件的名称。

这种方法的问题是,当2个或多个实例正在运行,日志往往搞的一团糟从实例来交错写入。

请注意,我用的块以为这样就导致在日志中写入一个转到文件,这样就避免了这个问题。

我从Vivek Gite post看到logger命令。但问题是它不写入我可以指定的文件,而是写到/ var/log/message。

任何帮助,非常感谢。

感谢和问候 思碧

+0

如果将所有的写入组合到一个'printf'语句中,会发生什么?如果您放弃单条消息的多行并仅使用一行消息来处理,会发生什么情况? –

+0

不起作用,我仍然得到交织消息 –

回答

1

试图把3个printfs输出作为一个字符串,即

printf "Epsilon batch stop request successful. \n  Time   :: %s\n  PID of process :: %s\n" "$now" ${PID[0]} 

你可能仍然得到交织。

为什么不和自己的日志文件开始每个实例,使用你的日志文件名的$ {} PID,让他们分开?即

>> "${mylogfile}.${PID}" 

编辑

正如你希望的记录仪,检查了手册页:

logger(1) - Linux man page 

Name 

logger - a shell command interface to the syslog(3) system log module 

Synopsis 
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...] 

Description 

Logger makes entries in the system log. It provides a shell command interface to the syslog(3) system log module. 

Options: 

    -i'   Log the process id of the logger process with each line. 
    -s' Log the message to standard error, as well as the system log. 
    -f file 
     Log the specified file. 

..... 

这看起来像你想要什么。

我希望这会有所帮助。

+0

嗨贝特尔,我有一个限制,我必须登录到一个文件。有没有一种方法可以使用记录器写入自定义文件? –

3

POSIX(IEEE Std 1003.1-2001)没有定义并发write()系统调用向同一个文件发送数据的行为,因此根据您的平台可能会得到不同的结果。您可以尝试将所有printfs合并为一个,希望这可以起作用,但即使这样做也不能保证它将来或在不同的平台上。

而不是使用并发控制和冲洗,以确保写入测序,可以发送邮件到第三过程,将按顺序写日志信息到文件代表的所有进程。事实上,这是loggersyslog在你引用的post中所做的事情。 logger命令不会将消息发送到/var/log/messages。它将日志消息发送到syslog,该日志消息可以配置为将日志消息保存在任何你喜欢的地方。不过,更改此配置通常需要管理权限。

如果您不能或不想使用syslog,您还可以使用netcat作为日志记录服务器。运行此复从所有脚本所有传入的日志消息到文件(此作业应保持在后台运行所有的时间,你也可以在screen运行):

nc -luk localhost 9876 > shared_log_file & 

(端口9876仅仅是一个例如),并登录每个脚本是这样的:

printf "Log message\n" > /dev/udp/localhost/9876 

您还可以使用自定义的UDP服务器,而不是netcat的(例如像this one)。

+0

嗨,亚当,谢谢你的好解释。任何指向我可以得到记录器样本的指针都会很棒。我尝试了网络,但没有结果。 –

+0

我仍然认为这是不必要的复杂,因为他可以将其相关的printfs分组到子shell中并重定向其输出,因为他没有寻找特定类型的日志记录行为(例如通过syslog(3)),他只想要“事务性“写道。 – jkh

+0

嗨亚当和jkh,JKH是正确的寻找交易写。多数民众赞成你帮助我 –

2

该块没有以任何方式对printfs进行分组,正如您发现的那样。然而,你可以做的是在子shell中(括号之间)执行所有这些命令,然后重定向子shell的输出!

1

根据日志记录的性质,它可能非常适合系统日志而不是其专用日志文件。在这种情况下,logger程序可能是手动记录的一个非常好的选择。

+0

我喜欢这个建议。没有提到为什么系统日志不能被使用。 – Chris

+0

嗨phasetwenty,我有一个要求在自定义位置登录文件。 –