标记内的Java XML日志记录

标记内的Java XML日志记录,java,filehandler,Java,Filehandler,例如,我正在尝试生成一个XML日志,它一个接一个地记录消息 <?xml version="1.0" encoding="UTF-8"?> <log> <message>Message 1</message> <message>Message 2</message> //Next messages to append here </log> 信息1 信息2 //要附加到此处的下一条消息 我看

例如,我正在尝试生成一个XML日志,它一个接一个地记录消息

<?xml version="1.0" encoding="UTF-8"?>
<log>
   <message>Message 1</message>
   <message>Message 2</message>
   //Next messages to append here
</log>

信息1
信息2
//要附加到此处的下一条消息
我看过各种各样的解决方案,但没有一个像我要求的那样有效。 我最接近的方法是使用以下内容:

我对它进行了调整,以满足我的需要

public String format(LogRecord rec) {
  StringBuffer buf = new StringBuffer(1000);
  buf.append('\n');
  buf.append(formatMessage(rec));
  buf.append('\n')
  return buf.toString() ;
}
public String getHead(Handler h) {
 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<log>";
}
public String getTail(Handler h) {
  return "</log>";
}
公共字符串格式(LogRecord rec){
StringBuffer buf=新的StringBuffer(1000);
buf.append('\n');
追加(格式化消息(rec));
buf.append('\n')
返回buf.toString();
}
公共字符串getHead(处理程序h){
返回“\n”;
}
公共字符串getTail(处理程序h){
返回“”;
}
问题是在关闭我的FileHandler之前不会调用getTail,因此它只有在关闭时才有效

我已经关闭了它,并尝试在下一条消息中用append=true重新打开FileHandler,但这(毫不奇怪)会附加到日志的末尾。 e、 g


信息1
信息2

这感觉应该很简单…

[http://logback.qos.ch/][logback]是xml格式的最新日志记录系统。 您可以记录错误、调试、跟踪和信息级别的信息。 您可以指定每天要记录的文件名。 下面提到了一个涵盖这些内容的示例

 <configuration>

  <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />

  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/mnt/resource/fe/frontend.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>/mnt/resource/fe/frontend-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 100MB -->
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
      <pattern>%date - [%level] - %message%xException%n</pattern>
    </encoder>
  </appender>

  <logger name="play" level="INFO" />
  <logger name="application" level="INFO" />

  <root level="ERROR">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

/mnt/resource/fe/frontend.log
/mnt/resource/fe/frontend-%d{yyyy-MM-dd}.%i.log
100MB
%日期-[%level]-%message%x异常%n

除非您想玩随机访问文件写入的游戏,这样您就可以用新的日志项和新的结束标记覆盖文档元素的结束标记,或者愿意接受文档片段方法,否则您可能只需要满足于在程序退出之前输出的XML格式不正确。
 <configuration>

  <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />

  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/mnt/resource/fe/frontend.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>/mnt/resource/fe/frontend-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 100MB -->
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
      <pattern>%date - [%level] - %message%xException%n</pattern>
    </encoder>
  </appender>

  <logger name="play" level="INFO" />
  <logger name="application" level="INFO" />

  <root level="ERROR">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>