如何将tinylog滚动日志文件写入user.home目录?
如何将tinylog滚动日志写入user.home目录?
我需要实现将tinylog的滚动日志文件写入user.home目录,尝试了两种方法都遇到问题:
尝试方法1:系统属性+配置文件
先通过代码设置系统属性:
System.setProperty("tinylog.directory", PathHelper.getLoggingDir());
再在tinylog.properties中配置路径:
writerRollingFile.file = ${tinylog.directory}/demo/logs/{date:yyyy-MM-dd}-log.{count}.txt writerRollingFile.latest = ${tinylog.directory}/demo/logs/latest.txt
问题:配置文件无法识别${tinylog.directory}变量。
尝试方法2:代码直接配置tinylog
改用代码直接配置日志路径:
Configuration.set("writerRollingFile.file", String.format("%1$s%2$s%3$s", PathHelper.getLoggingDir(), File.separator, "{date:yyyy-MM-dd}-log.{count}.txt")); Configuration.set("writerRollingFile.latest", String.valueOf(Paths.get(PathHelper.getLoggingDir() , "latest.txt")));
问题:writerRollingFile.file配置失效,生成的滚动日志路径中多了一个分号,例如C:\Users\MyUserName\demo\logs;2022-10-17-log.0.txt,但latest.txt能正常生成在正确目录。
我的PathHelper.getLoggingDir()核心代码如下:
Path pathToFile = Paths.get(sUserHomeDir, sAppName, sLoggingDir);
解决方法
感谢Martin的提示,将配置文件中的变量前缀${...}替换为#{...}后问题解决。
正确的tinylog.properties配置
# rolling file writerRollingFile = rolling file writerRollingFile.level = warn writerRollingFile.format = {date: dd.mm.yyyy HH:mm:ss.SSS} {level}: {class}.{method}()\t{message} writerRollingFile.file = #{tinylog.directory}/{date:yyyy-MM-dd}-log.{count}.txt writerRollingFile.latest = #{tinylog.directory}/latest.txt writerRollingFile.charset = UTF-8 writerRollingFile.buffered = true writerRollingFile.policies = startup, daily: 00:00, size: 1mb writerRollingFile.backups = 100 writerRollingFile.convert = gzip
启动时设置系统属性
System.setProperty("tinylog.directory", PathHelper.getLoggingDir());
完整的PathHelper.getLoggingDir()实现
private static final String sUserHomeDir = System.getProperty("user.home"); private static final String sAppName = "Demo"; private static final String sLoggingDir = "Logs"; public static String getLoggingDir() throws IOException { // 自动适配不同系统的路径分隔符 Path pathToFile = Paths.get(sUserHomeDir, sAppName, sLoggingDir); // 自动创建目录(含父目录),目录已存在时不会抛出异常 Files.createDirectories(pathToFile); return pathToFile.toString(); }
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

