我想将主机名和日期附加到日志文件名。所以日志文件名称应该类似于 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>
如何根据日志模式添加过滤器,而不是StringMatchFilter
。我希望模式匹配。
提前致谢
答案 0 :(得分:4)
在log4j2 documentation之后你可以进行环境变量查找,所以在类Unix系统中这应该可行:
<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
<File name="File1" fileName="${MYHOST}_file.log">
...
</File>
</Appenders>
请注意默认情况下$ HOSTNAME并不总是可用,您可能需要在shell中显式导出它,请参阅this post。
答案 1 :(得分:3)
首先从您的java代码 然后 将log4j 配置到应用程序中,
注意:在代码执行时处理或捕获所需的异常。
// 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");
更新:
如果您的应用是网络应用,
然后需要在tomcat-server
开始之后和任何application
运行之前配置我们想要的属性,
为此创建一个实现ApplicationConfiguration
接口的类ServletContextListener
,这有助于在任何应用程序运行之前先运行。
也这样做,
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationConfiguration implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
try {
// 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()));
} catch (UnknownHostException e) {
System.out.println("Error Message : " + e.getMessage());
//e.printStackTrace();
}
}
}
...
同样设置log4j.xml文件,
<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${path}/app_${hostName}.${currentDate}.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>
请相应地更新web.xml文件,
<web-app ...>
<listener>
<listener-class>
com.pck1.ApplicationConfiguration
</listener-class>
</listener>
</web-app>
此配置需要应用于
web.xml
,因为应用程序 在开始时,通过这种配置,它将遵循它 上下文监听器。
更新2:
<logger name="packageName.AAA" additivity="false" >
<level value="INFO" />
<appender-ref ref="applog"/>
</logger>
答案 2 :(得分:1)
比照。对于类似的问题https://hackage.haskell.org/package/attoparsec-csv,请求并不明显,即使根据此邮件列表response,这是一个长期的请求。
使用最新版本的log4j,本文档thread的结尾似乎已经使用了属性提供了该功能。
无论如何,您始终可以使用专门的模式布局自行完成解决方案,例如section。
答案 3 :(得分:1)
您可以定义系统属性hostname
并更改配置:
<param name="File" value="${path}/app_${hostname}.log" />
确保在log4j初始化之前设置了系统属性。
有关添加过滤器的信息,请参阅Filter log by matching pattern - log4j
的回答<强>更新:强> 编写不同日志的简单解决方案:
<logger name="com"><!-- for Class Package is com.???... -->
<level value="INFO" />
<appender-ref ref="applog" />
</logger>
<logger name="loggerForCustomClass">
<level value="INFO" />
<appender-ref ref="customlog" />
</logger>
更改程序中的代码:
//message will write to "customlog" appender
Logger.getLogger("loggerForCustomClass").info("log from custom class");
//message will write to "applog" appender
Logger.getLogger(getClass()).info("log from other class");
答案 4 :(得分:1)
以下配置可以解决问题
<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());
答案 5 :(得分:1)
我发现默认情况下只有 ${hostName}
适用于最新的 log4j
像这样:
<File name="file" fileName="${baseDir}/${hostName}-file.log" append="true">
这在此处记录: https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
在默认属性部分:
<块引用>默认映射预先填充了 "hostName" 的值,即当前系统的主机名或 IP 地址
答案 6 :(得分:0)
编写自己的自定义appender,扩展基本的appenderws。这将帮助您操纵java中的属性。
请参阅此答案https://stackoverflow.com/a/1324075/1594992
或者只需设置命令行参数&amp;像这个答案的系统属性
答案 7 :(得分:0)
请尝试:"${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"