Jira 7.3.6自定义认证器日志未写入问题排查求助
我之前在开发Jira自定义认证插件时,也碰到过一模一样的问题——代码明明执行了(System.out能打出来),但log4j的日志就是没写入指定文件。结合Jira 7.x的日志机制,给你梳理几个最可能的原因和解决办法:
1. 你修改的log4j配置文件根本没被Jira加载
Jira 7.x用的是log4j 1.x,它只会优先加载安装目录下的主配置文件:JIRA_INSTALL/atlassian-jira/WEB-INF/classes/log4j.properties。如果你改的是自定义插件内部的log4j配置,或者路径不对,那肯定不会生效。
- 排查:重启Jira后,查看Jira的启动日志(
JIRA_HOME/logs/atlassian-jira.log),找有没有类似log4j: Reading configuration from URL file:/path/to/jira/atlassian-jira/WEB-INF/classes/log4j.properties的记录,确认加载的是你修改的那个文件。 - 解决:确保在主配置文件里给你的自定义认证器类添加对应的logger配置,比如:
这里的# 替换成你的自定义认证器的全类名 log4j.logger.com.yourcompany.jira.auth.CustomAuthenticator=DEBUG, fileAppender # 避免日志重复输出到根logger log4j.additivity.com.yourcompany.jira.auth.CustomAuthenticator=falsefileAppender要对应配置里已有的appender(比如Jira默认的fileAppender,或者你自己定义的appender)。
2. Logger实例的类路径和配置不匹配
很多时候是代码里获取Logger的方式错了,导致log4j找不到对应的配置规则。比如硬编码的包名写错,或者用this.getClass().getName()但类被OSGi类加载器加载时的实际路径和你预期的不一样。
- 排查:在代码里加一行System.out打印Logger的名字:
然后对比你在log4j.properties里配置的logger路径,看是不是完全一致(包括大小写、包名)。Logger logger = Logger.getLogger(CustomAuthenticator.class); System.out.println("Logger name: " + logger.getName()); - 解决:统一用
Logger.getLogger(YourCustomAuthenticator.class)来获取Logger,不要硬编码字符串,避免拼写错误。
3. Appender的阈值设置过滤了你的日志
如果你的appender配置了Threshold(日志级别阈值),而你代码里用的日志级别低于这个阈值,日志会被直接过滤掉。比如appender设为INFO,但你用的是logger.debug("xxx"),那debug日志就不会写入文件。
- 排查:查看log4j.properties里对应appender的配置,比如:
对比你代码里的日志级别(debug/info/warn/error)。log4j.appender.fileAppender.Threshold=INFO - 解决:要么把appender的Threshold调低(比如改成
DEBUG),要么把代码里的日志级别调高到符合要求(比如改成logger.info("xxx"))。
4. Jira后台的日志级别覆盖了配置文件
这是最容易被忽略的坑!Jira管理员后台的日志设置会直接覆盖log4j.properties里的配置。即使你在配置文件里设了DEBUG,后台如果设成INFO,那debug日志还是打不出来。
- 排查:登录Jira管理员账号,进入「系统」→「日志和 profiling」,在搜索框输入你的自定义类的包名,看当前的日志级别是不是你期望的(比如DEBUG)。
- 解决:如果后台级别不对,改成你需要的级别,并且点击「保存为默认」,这样重启Jira后也会生效。
5. 日志文件路径没有写入权限
虽然System.out的输出能看到(它直接打印到控制台或Jira的catalina.out),但Jira运行的系统用户(比如Linux下的jira用户)可能没有你指定的日志文件路径的写入权限,导致log4j无法写入。
- 排查:用命令查看文件权限(Linux):
看Jira运行用户有没有写权限(w权限)。Windows下可以右键文件→属性→安全选项卡检查。ls -l /path/to/your/logfile.log - 解决:给Jira运行用户赋予该路径的写入权限,比如Linux下:
chown jira:jira /path/to/your/logfile.log chmod 644 /path/to/your/logfile.log
6. 自定义插件的log4j依赖冲突
如果你的插件打包时自带了log4j依赖,会和Jira自身的log4j版本冲突,导致日志无法正确输出。Jira已经提供了log4j,插件不需要自己打包进去。
- 排查:检查插件的pom.xml(Maven构建),看log4j依赖的
<scope>是不是provided。如果是compile,那插件就会自带log4j。 - 解决:把log4j依赖的scope设为
provided,让插件使用Jira自带的log4j:<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <!-- Jira 7.3.6对应的log4j版本 --> <scope>provided</scope> </dependency>
按照上面的步骤逐一排查,应该能解决你的问题。我当时就是因为后台日志级别被改成了INFO,折腾了半天才发现😂
内容的提问来源于stack exchange,提问作者u123

