将输出重定向到滚动文件

时间:2012-04-26 13:56:11

标签: java linux bash log4j

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

有没有办法使用OS核心内容来做到这一点?

我的客户困惑于我为每个应用程序创建日志文件并将所有标记记录下来。
该应用程序是一个长期运行的应用程序,包含几个以不同JVM启动的模块(换句话说,这些是几个应用程序)并使用相同的log4j.properties文件。
我正在使用java和log4j,但log4j loggs 每个包不是每个应用程序。它不适合我,因为两个模块可以具有相同的包(记录器类别),但是可以指向不同的文件 应用程序模块使用.sh脚本启动。

由于

4 个答案:

答案 0 :(得分: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。你看到了相关性吗?

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

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

答案 1 :(得分:2)

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

  • rotatelogs,Apache的一部分。这将从stdin读取并根据时间写入日志文件;它会根据需要更改日志文件。您可以使用find -mtime ...

  • 等简单工具清理旧的日志文件
  • svlogdrunit的一部分。这与rotatelogs类似,但会根据需要自动删除旧文件,并且在大小限制上工作更多,而不是基于时间的轮换。

  • 如果您在supervisor等流程管理器下运行程序,流程管理器可以处理日志记录输出,滚动日志文件等。

还有很多其他类似的解决方案......我确信也有一些特定于Java的想法,但我会留给其他人。

答案 2 :(得分: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}:您可以使用-DappName=MyApp将其作为启动参数传递给vm。您也可以使用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:)

答案 3 :(得分:1)

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

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

谢谢,投票给大家;)