Java 如何将主机名附加到log4j.xml中的日志文件

Java 如何将主机名附加到log4j.xml中的日志文件,java,logging,log4j,logfile,Java,Logging,Log4j,Logfile,我想将主机名和日期附加到日志文件名中。因此日志文件名应该类似于app_hostname.date.log。 注意:这应该在linux和windows中运行。 <appender name="applog" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${path}/app.log" /> <param name="MaxFil

我想将主机名和日期附加到日志文件名中。因此日志文件名应该类似于app_hostname.date.log。 注意:这应该在linux和windows中运行。

<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${path}/app.log" />
        <param name="MaxFileSize" value="1MB" />
        <param name="DatePattern" value=".dd-MM-yyyy" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
        </layout>
</appender>
// step-1 : set hostName into System's property, which will use by log4j
System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
//step - 2 : set currentDate into System's property, which will use by log4j
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
//step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then.
org.apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required.

//LOG.debug("anything whatever programmer what to log");

以及如何根据日志模式添加过滤器,而不是像
StringMatchFilter
。我希望模式匹配。 提前感谢

Cf。对于类似的问题,即使根据此邮件列表,这是一个长期的请求,请求也不会明显满足

使用log4j的最新版本,本文档的结尾似乎已经有了使用properties提供的功能


无论如何,您始终可以通过专门的模式布局自行完成此操作,例如。

您可以定义系统属性
主机名
并更改配置:

<param name="File" value="${path}/app_${hostname}.log" />

下面的配置就可以了

<appender name="file" class="org.apache.log4j.RollingFileAppender">
        <param name="append" value="false" />
        <param name="maxFileSize" value="10MB" />
        <param name="maxBackupIndex" value="10" />
        <param name="file" value="C:\\Users\\kavurira\\Desktop\\log4j-${HostName}.log" />
        <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m${HostName}%n" />
        </layout>
    </appender>

Just set "HostName" as system property, before initialization of Log4j.

System.setProperty("HostName", InetAddress.getLocalHost().getHostName());

在初始化Log4j之前,只需将“HostName”设置为系统属性。
System.setProperty(“主机名”,InetAddress.getLocalHost().getHostName());

编写您自己的自定义appender,扩展基本appender。这将帮助您操作java中的属性

看到这个答案了吗

或者简单地设置命令行参数&系统属性,如下所示


首先从java代码执行此操作,然后将log4j配置到应用程序中

注意:在执行代码时处理或捕获所需的异常。

<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${path}/app.log" />
        <param name="MaxFileSize" value="1MB" />
        <param name="DatePattern" value=".dd-MM-yyyy" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
        </layout>
</appender>
// step-1 : set hostName into System's property, which will use by log4j
System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
//step - 2 : set currentDate into System's property, which will use by log4j
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
//step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then.
org.apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required.

//LOG.debug("anything whatever programmer what to log");
更新:

<logger name="packageName.AAA" additivity="false" >
    <level value="INFO" />
    <appender-ref ref="applog"/>
 </logger>
如果您的应用程序是web应用程序, 然后需要在
tomcat服务器
启动之后和任何
应用程序
运行之前配置我们想要的属性

为此,创建一个类
ApplicationConfiguration
,该类实现了
ServletContextListener
接口,该接口有助于在任何应用程序运行之前首先运行

同样地

同样设置log4j.xml文件,

遵循log4j2,您可以进行环境变量查找,因此在类Unix系统中,这应该可以工作:

<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
  <File name="File1" fileName="${MYHOST}_file.log">
  ...
  </File>
</Appenders>
${env:HOSTNAME}
.

尝试以下操作:
“${env:HOST}-${date:yyyy-MM-dd}”
主机名+日期。在yaml中

Properties:
    Property:
      - name: log-path
        value:  "logs"
      - name: filePattern
        value:  "${env:HOST}-${date:yyyy-MM-dd}"

  Appenders:

    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    File:
      name: File_Appender
      fileName: "${log-path}/filelog-${filePattern}.log"

我发现默认情况下只需
${hostName}
就可以用于最新的log4j

大概是这样的:

    <File name="file" fileName="${baseDir}/${hostName}-file.log" append="true">

这记录在此处:

在默认属性部分中:

默认映射预先填充了“hostName”的值,即当前系统的主机名或IP地址


在哪里设置hostname属性,我没有任何servlet(启动时加载)…启动时不需要加载,必须登录或启动项目,对吗?在项目Logger=Logger.getLogger(“classname”)中执行以下行之前,必须在项目中设置属性我尝试过…但在我的例子中,日志文件是在应用程序启动时生成的..所以它不使用名称让我知道您使用的是哪个应用程序服务器?谢谢您的回答,但对我来说,主要问题是同一个包有两个日志,但如果它来自我的自定义类,它应该写入一个日志,如果它来自该类以外的其他类,它应该写入另一个。感谢您的回答,但对我来说,主要问题是同一个包有两个日志,但是如果它来自我的自定义类,它应该写入一个日志,如果它来自该类以外的类,它应该写入另一个日志。log4j将在应用程序启动时加载,那么如何通过system.SetProperty定义如何调用log4j,是否有基类?如果是这样,您可以设置属性thereLog4j在spring引导后正在初始化。信息:初始化spring根Web应用程序上下文log4j:Warn请考虑使用
logback
log4j2
。使用logback的
SiftingAppender
@Nati启动,请更具体。。如果可能,在应用程序启动时调用代码段log4j。@Sam您的应用程序是web应用程序?是的,它是web应用程序…tomcat是应用程序server@Sam参考我的“更新”section@Samonce类应用程序配置(我的建议)创建时无需为set hostname和currentDate设置上述两个步骤,因为它由ApplicationConfiguration-class本身处理。
<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
  <File name="File1" fileName="${MYHOST}_file.log">
  ...
  </File>
</Appenders>
Properties:
    Property:
      - name: log-path
        value:  "logs"
      - name: filePattern
        value:  "${env:HOST}-${date:yyyy-MM-dd}"

  Appenders:

    Console:
      name: Console_Appender
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    File:
      name: File_Appender
      fileName: "${log-path}/filelog-${filePattern}.log"
    <File name="file" fileName="${baseDir}/${hostName}-file.log" append="true">