Log4j:将生成的日志文件名设置为包含主机名



我正在尝试使用 log4j 生成日志。日志记录部分工作正常,但我想在文件名中包含要附加的主机名(生成日志的位置)。

例如:我当前的日志文件名:记录器.2019-06-12-06-14

我想要的: logger_$主机.2019-06-12-06-14 ,其中$HOST是主机名

我已经在stackoverflow中看到过其他帖子,并且根据这一点,我已经在我的Java代码中设置了主机名,我认为在调用log4j之前已经设置了主机名

static {
try {
HOST_NAME = InetAddress.getLocalHost().getCanonicalHostName();
} catch (UnknownHostException e) {
HOST_NAME = "localhost";
}
System.setProperty("hostname", HOST_NAME);
}

并修改了 cfg 文件(我们在其中为所有记录器定义了属性),以包含系统属性:

*.*.log4j.appender.MyLogger.File=/logs/logger_$hostname;

但是生成的文件名是logger_$hostname.2019-06-12-06-14(字面意思是$hostname而不是属性值)

在帖子中,它确实提到在 cfg 文件中分配变量的方法是logger_${hostname},但在编译时会抛出意外的{ 错误,所以我只是$hostname代替。

我也尝试过其他方法,比如把

*.*.log4j.appender.MyLogger.File=/logs/logger_$env:hostname;
*.*.log4j.appender.MyLogger.File=$hostname;
*.*.log4j.appender.MyLogger.File=/logs/logger_$HOST;
(thinking since its running in unix, it might pick the HOST variable :( )

但到目前为止没有运气。知道我可能做错了什么吗?

顺便说一句,我通过以下方式调用记录器:

private static Logger logger = Logger.getLogger("MyLogger");

那么,是否可以从我正在记录的类中设置主机名。我确实想每分钟轮换一次日志,所以不想弄乱其他 log4j 设置。我的完整 log4j 追加器属性:

*.*.log4j.logger.myLogger=(INFO,MyLogger);
*.*.log4j.additivity.myLogger=false; # this logger does not show up in main logs
*.*.log4j.appender.MyLogger.File=/logs/logger_$hostname;
*.*.log4j.appender.MyLogger.layout=org.apache.log4j.PatternLayout;
# %n: new line for each entry
*.*.log4j.appender.MyLogger.layout.ConversionPattern="%m%n";
*.*.log4j.appender.MyLogger.Append=true;
*.*.log4j.appender.MyLogger.ImmediateFlush=true;
*.*.log4j.appender.MyLogger.Encoding=UTF8;
# Enable 1 minute rotation
*.*.log4j.appender.MyLogger.DatePattern="'.'yyyy-MM-dd-HH-mm";
# Disable periodic flush since files will be flushed upon rotation that happens every minute
*.*.log4j.appender.MyLogger.PeriodicFlush=false;

任何修复它的想法都将非常有帮助。(很抱歉,因为它是一个重复的问题,但我无法弄清楚早期帖子的问题:(

您可以使用 log4j2 中的${env:HOST}选项进行环境查找.xml如文档中所述:https://logging.apache.org/log4j/2.0/manual/lookups.html#EnvironmentLookup

例如:

<RollingRandomAccessFile name="CustomLoggerRandomFile"
fileName="logs/${env:HOST}_system.log"
filePattern="${env:HOST}_system-%d{yyyy-MM-dd}-%i.log.gz"
immediateFlush="false">

编辑:我假设您正在使用log4j2,并且必须在主机(生成日志的位置)中创建$HOST变量作为环境变量。

我已经将${hostname}替换为${hostName}并且它起作用了。

最新更新