Slf4J在Linux Screen会话中无法写入日志文件的问题求助
问题描述
Slf4j需将日志写入LatestLog.log文件。直接执行命令java -jar Bot.jar args...时,日志可正常写入/logs/LatestLog.log;但通过命令screen -d -m -S TestBot java -jar Bot.jar在Linux Screen会话中运行时,无日志生成。
相关配置
依赖配置(pom.xml)
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> <version>1.7.36</version> <scope>runtime</scope> </dependency>
log4j配置
log4j.rootLogger=INFO, stdout, fout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Threshold=INFO log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{'['HH:mm:ss']'} >> %-5p<< | %m%n #log4j.appender.stdout.layout.ConversionPattern=%d{'['HH:mm:ss']'} >> %-5p<< [%c{2}] --> %m%n log4j.appender.fout=org.apache.log4j.FileAppender log4j.appender.fout.Threshold=DEBUG log4j.appender.fout.File=logs/Latestlog.log log4j.appender.fout.layout=org.apache.log4j.PatternLayout log4j.appender.fout.layout.ConversionPattern=%d{'['dd.MM.yyyy' | 'HH:mm:ss']'} >> %-5p << [%c] - %m%n #log4j.appender.fout.org.apache.http.wire=INFO log4j.logger.org.apache.http.wire=INFO log4j.logger.org.apache.http.headers=INFO
系统环境
Debian 4.19.269-1
已尝试操作
- 修改logs文件夹权限
- 搜索相关资料未找到解决方案
解决方案
1. 修正Screen工作目录
Screen后台启动时默认工作目录可能和你直接运行jar时不一致,导致相对路径logs/Latestlog.log无法定位到正确的文件夹。解决方法是在命令中指定jar所在的工作目录:
screen -d -m -S TestBot bash -c "cd /实际路径/到/Bot.jar所在目录 && java -jar Bot.jar"
替换/实际路径/到/Bot.jar所在目录为jar文件的真实存放路径。
2. 统一文件名大小写
Linux是大小写敏感系统,你描述的目标日志文件是LatestLog.log(大写L),但log4j配置里写的是Latestlog.log(小写l),这会导致路径匹配失败。把配置里的文件名改成和预期一致:
log4j.appender.fout.File=logs/LatestLog.log
3. 明确指定log4j配置文件路径
如果Screen运行时无法加载到log4j配置文件,可在java命令中直接指定配置文件的绝对路径:
screen -d -m -S TestBot bash -c "cd /实际路径/到/Bot.jar所在目录 && java -Dlog4j.configuration=file:/实际路径/到/log4j配置文件 -jar Bot.jar"
确保替换配置文件的真实绝对路径。
4. 验证运行用户权限
检查Screen会话的运行用户是否和你直接启动jar的用户一致:
ps aux | grep TestBot
若用户不同,可能导致无权限写入logs目录,可指定用户运行:
screen -d -m -S TestBot sudo -u 你的用户名 bash -c "cd /实际路径/到/Bot.jar所在目录 && java -jar Bot.jar"
5. 查看Screen会话的控制台输出
重新连接到Screen会话,查看是否有log4j的错误提示:
screen -r TestBot
如果出现类似Could not open file logs/LatestLog.log的报错,可直接定位是路径或权限问题。
内容的提问来源于stack exchange,提问作者user20851022
相关产品推荐
相关产品推荐

