【问题标题】:Error: "setFile(null,false) call failed" when using log4j错误:使用 log4j 时出现“setFile(null,false) call failed”
【发布时间】:2012-05-27 18:27:51
【问题描述】:

我在项目的源文件夹中添加了 log4j.properties 文件,但我仍然收到 log4j:error。

这是我的 Log4j.properties 文件:

    .rootCategory=DEBUG, R, O
    # Stdout
    log4j.appender.O=org.apache.log4j.ConsoleAppender
    log4j.appender.O=log44j.log
    # File
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=log4j.log

    # Control the maximum log file size
    log4j.appender.R.MaxFileSize=100KB

    # Archive log files (one backup file here)
    log4j.appender.R.MaxBackupIndex=1

    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.O.layout=org.apache.log4j.PatternLayout

    log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n
    log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n

    # Define the root logger with appender file
    logDir = ../logs
    log4j.rootLogger = DEBUG, FILE

    # Define the file appender
    log4j.appender.FILE=org.apache.log4j.FileAppender
    log4j.appender.FILE.File=logs/${file.name}
    log4j.appender.FILE.Append=false

    # Define the layout for file appender
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

这是我得到的 Java 异常:

log4j:ERROR setFile(null,false) call failed.
java.io.FileNotFoundException: logs (Access is denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:809)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.log4j.Logger.getLogger(Logger.java:104)
    at lib.Dashboard.Reports.<init>(Reports.java:34)
    at testcases.AmazonDashboard.TC_DB17.main(TC_DB17.java:54)
AmazonDashboardTC_DB17Exception in thread "main" java.lang.NullPointerException
    at testcases.AmazonDashboard.TC_DB17.main(TC_DB17.java:131)

请告诉我,如何解决此异常,因为我尝试将我的属性文件放在根文件夹中,现在我已放置在源文件夹中,但在这两种情况下我都遇到了上述异常。

【问题讨论】:

  • log4j.appender.FILE.File=logs/${file.name} 这不在最终文件中,对吧?那么这里已经部署的 log4j.properties 中的值是多少呢?

标签: java file logging log4j


【解决方案1】:

看看错误 - 'log4j:ERROR setFile(null,false) 调用失败。 java.io.FileNotFoundException: 日志(访问被拒绝)'

似乎有一个名为“logs”的日志文件被拒绝访问,即它没有足够的权限来写入日志。尝试通过授予“日志”日志文件的写入权限。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。这是对我有用的解决方案:只需以这种方式将您的属性文件路径放在 cmd 行中:

    -Dlog4j.configuration=<FILE_PATH>  (ex: log4j.properties)
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我怀疑变量${file.name} 没有正确替换。结果,log4j.appender.FILE.File 的值变为logs/。因此,Java 尝试创建一个名为 logs/ 的日志文件,但它可能是一个现有目录,因此您会遇到异常。

      作为一种快速补救措施,将log4j.appender.FILE.File 设置更改为通过绝对路径指向文件,例如/tmp/mytest.log。你不应该得到一个例外。

      之后,您可以继续调试为什么 ${file.name} 没有在您的运行时环境中正确替换。

      【讨论】:

      • 这在应用程序有多个日志文件的情况下绝对有用
      【解决方案4】:

      请将您的日志文件位置更改到另一个驱动器。它会起作用的。

      这是创建日志文件的权限。

      【讨论】:

        【解决方案5】:

        如果是window7(和我的一样),没有管理员权限不能在C:盘写文件

        只需在 log4j.properties 文件中提供另一个文件夹

        设置文件名

        log4j.appender.FILE.File=C:\server\log.out 你可以用notepad++查看

        【讨论】:

          【解决方案6】:

          尝试使用 sudo(超级用户)执行您的命令,这对我有用 :)
          运行:$ sudo your_command
          之后输入超级用户密码。就是这样。。

          【讨论】:

          • 有时你不能在共享系统上拥有这样的特权
          【解决方案7】:

          由于当前用户访问无法访问您提供的附加文件位置,因此出现此错误。

          快速解决方案,将 log4j.appender.FILE.File 设置更改为使用您已登录的当前用户可访问的绝对路径指向文件,例如 /tmp /myapp.log。现在您应该不会收到错误消息。

          【讨论】:

            【解决方案8】:

            我只是将写入权限添加到“日志”文件夹,它适用于我

            【讨论】:

              【解决方案9】:

              为了防止这个问题,我将目录 ${kafka.logs.dir} 的 log4j.properties 文件中的所有值更改为我自己的目录。例如 D:/temp/...

              【讨论】:

                【解决方案10】:

                这是你的配置:

                log4j.appender.FILE.File=logs/${file.name}
                

                这个错误发生了:

                java.io.FileNotFoundException: logs (Access is denied)
                

                所以看来file.name这个变量没有设置,java尝试写入目录logs


                你可以强制你的变量${file.name}使用这个选项调用maven的值-D

                mvn clean test -Dfile.name=logfile.log
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-03-27
                  • 2020-09-15
                  • 2013-04-12
                  • 2014-01-05
                  • 2023-03-21
                  相关资源
                  最近更新 更多