4

有很多示例如何将程序输出重定向到文件。
我需要设置文件的最大大小并滚动文件(消失旧消息)或备份旧文件并开始记录到新文件。

有没有办法使用操作系统核心的东西来做到这一点?

我的客户对我为每个应用程序创建日志文件并在那里记录所有标准感到困惑。
该应用程序是长时间运行的应用程序,包含多个模块,这些模块在不同的 JVM 中启动(换句话说,这些是多个应用程序)并使用相同的 log4j.properties 文件。
我正在使用 java 和 log4j,但 log4j每个包而不是每个应用程序的日志。它不适合我,因为两个模块可以有相同的包(记录器类别),但应该指向不同的文件。
应用程序模块使用 .sh 脚本启动。

谢谢

4

4 回答 4

3

log4j 不基于包登录。您可以为其提供任何您喜欢的名称。

在您的 log4j.xml 中,添加以下内容:

<appender name="USERACTION" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/logs/useraction.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d%m%n" />
    </layout>
</appender>

<logger name="UserAction" additivity="false">
    <level value="INFO" />
    <appender-ref ref="USERACTION" />
</logger>

现在像这样实例化您的记录器:

private final static Logger LOG = Logger.getLogger("UserAction");

然后,记录到该记录器的所有内容都将进入文件 useraction.log。你看到相关性了吗?

在当前类之后命名记录器只是方便,但绝不是强制性的。

我经常使用它来区分日志条目。我的一些类有多个记录器实例,比如一个用于用户操作,一个用于低级内容,一个用于服务调用等等。

于 2012-04-26T14:20:59.667 回答
2

如果您的应用程序可以登录到stdout,则有许多工具可以提供帮助,例如:

  • rotatelogs,Apache 的一部分。这会根据时间读取stdin和写入日志文件;它负责根据需要更改日志文件。您可以使用简单的工具清理旧的日志文件,例如find -mtime ....

  • svlogd的一部分runit。这类似于rotatelogs,但会根据需要自动删除旧文件,并且更多地处理大小限制而不是基于时间的轮换。

  • 如果您在诸如supervisor之类的进程管理器下运行程序,则进程管理器可以处理日志输出、滚动日志文件等。

还有许多其他类似的解决方案……我相信也有许多特定于 Java 的想法,但我会把它留给其他人。

于 2012-04-26T14:09:12.050 回答
2

您可以让 log4j 在您的情况下使用不同的文件,具体取决于日志记录配置中的系统属性。(这个 appender 可以在log4j extras项目中找到)例如

  <appender name="R2" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="FileNamePattern" value="logs/log_${appName}.log.%d" />
      <param name="ActiveFileName" value="logs/log_${appName}.log" />
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %c -\n  %-5p: %m%n" />
    </layout>
  </appender>

请参阅${appName}:您可以将其作为启动参数传递给 vm,使用-DappName=MyApp. 您也可以在运行时使用 设置它System.setProperty(.., ..),但这必须在 log4j 初始化之前发生。您的启动器进程决定了该属性的价值。

您将拥有看起来像log_MyApp.log.

编辑:对不起,我错过了您正在使用属性文件并想要基于大小的滚动策略的事实。在这个文件中你可以写(但实际的技巧是一样的):

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File={myApp}.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

这是更完整的:http: //logging.apache.org/log4j/1.2/manual.html :)

于 2012-04-26T14:15:06.657 回答
2

最适合我(将 System.err 和 System.out 重定向到同一个日志文件,按大小拆分文件):

java MyApp 2>&1 | split -b500k - out.log

谢谢,大家投票赞成;)

于 2012-04-26T15:57:34.083 回答