使用Maven项目中的log4j将嵌入式Tomcat日志记录到某个文件

时间:2017-02-24 08:56:38

标签: java maven tomcat logging

简介

我一直在寻找这个问题,但到目前为止还没有运气。我正在构建一个使用嵌入式Tomcat作为servlet的Java webapp。我已将log4j设置为主记录器,并将日志发布到指定成功的文件中。因为嵌入了Tomcat,我找不到这个catalina.out文件,我通过SO和其他论坛找到了很多答案。

问题

我想要的是使用log4j将Tomcat日志记录到我用于记录整个webapp的同一文件中。我怎样才能做到这一点?有没有办法以编程方式执行此操作?

P.S。: 我使用Windows作为操作系统,Tomcat版本是8.0.30

2 个答案:

答案 0 :(得分:0)

默认情况下,tomcat使用[CATALINA_HOME]/conf/logging.properties。在那里编辑以下属性:

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = **YOUR_PATH_HERE**
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.

答案 1 :(得分:0)

事实证明这比我想象的要简单,所以我只是在这里为那些可能遇到同样问题的人留下答案。

我创建了一个函数initializeLogging()

private static void initializeLogging()


{  
  //Getting the current timestamp to use in log file naming
  Calendar calendar = Calendar.getInstance();
  java.text.DateFormat df = new java.text.SimpleDateFormat("yyMMddHHmmss");
  String timestamp = df.format(calendar.getTime());

  ConfigurationBuilder< BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

  builder.setStatusLevel(Level.ALL);
  builder.setConfigurationName("RollingBuilder");
  // create a console appender      
  AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
                                                                                                   ConsoleAppender.Target.SYSTEM_OUT);
  appenderBuilder.add(builder.newLayout("PatternLayout")
          .addAttribute("pattern", "<%d{yyyy/MM/dd HH:mm:ss}>  %p (%t).  %m%n"));
  builder.add(appenderBuilder);
  // create a rolling file appender
  LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
          .addAttribute("pattern", "<%d{yyyy/MM/dd HH:mm:ss}>  %p (%t).  %m%n");
  ComponentBuilder triggeringPolicy = builder.newComponent("Policies")              
          .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M"));
  //specifying log file name as well ss log file name if the first exceeds maximum size => 100M
  appenderBuilder = builder.newAppender("rolling", "RollingFile")
          .addAttribute("fileName", "logs/myLogging" + "_" + timestamp + ".log")              
          .addAttribute("FilePattern","logs/myLogging"+"_"+ timestamp + "%d{yyyyMMddHHmmss}" + ".log")
          .add(layoutBuilder)
          .addComponent(triggeringPolicy);
  builder.add(appenderBuilder);

  // create the new logger
  builder.add(builder.newLogger("myLogger", Level.ALL)
          .add(builder.newAppenderRef("rolling"))
          .addAttribute("additivity", false));

  builder.add(builder.newRootLogger(Level.ALL)
          .add(builder.newAppenderRef("rolling")));
  LoggerContext ctx = Configurator.initialize(builder.build());      


 }

所以这个函数的作用是在日志的每个条目上给出一个模式,并将日志指向我指定的文件。现在,每当我想记录某些内容时,我只需要调用Logger logger = LogManager.getLogger('myLogger)

所以它只是一个快速编程的log4j初始化。