程序化Logback设置和文件日志记录问题。

huangapple go评论92阅读模式
英文:

Programmatic Logback setup and file logging issue

问题

以下是翻译好的内容:

在一个基本应用程序中,我有3个依赖项:

  1. <dependencies>
  2. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  3. <dependency>
  4. <groupId>org.projectlombok</groupId>
  5. <artifactId>lombok</artifactId>
  6. <version>1.18.10</version>
  7. </dependency>
  8. <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
  9. <dependency>
  10. <groupId>ch.qos.logback</groupId>
  11. <artifactId>logback-classic</artifactId>
  12. <version>1.2.3</version>
  13. </dependency>
  14. <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
  15. <dependency>
  16. <groupId>org.slf4j</groupId>
  17. <artifactId>slf4j-api</artifactId>
  18. <version>1.7.29</version>
  19. </dependency>
  20. </dependencies>

我的目标是使用Logback编写一个日志记录器。我的约束是以编程方式开发它。我为我的日志记录器创建了一个配置类:

  1. public class LogbackConfig {
  2. // ...
  3. }

我可以在任何地方调用这个类,例如在这里:

  1. public class Main {
  2. public static void main(String[] args) {
  3. // ...
  4. }
  5. }

我的测试类只是记录一些文本。我的问题是,我在控制台上正确显示信息。我也正确地创建了日志文件,但是没有写入任何内容。

英文:

In a base app i have 3 dependencies :

  1. &lt;dependencies&gt;
  2. &lt;!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --&gt;
  3. &lt;dependency&gt;
  4. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  5. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  6. &lt;version&gt;1.18.10&lt;/version&gt;
  7. &lt;/dependency&gt;
  8. &lt;!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --&gt;
  9. &lt;dependency&gt;
  10. &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
  11. &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
  12. &lt;version&gt;1.2.3&lt;/version&gt;
  13. &lt;/dependency&gt;
  14. &lt;!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --&gt;
  15. &lt;dependency&gt;
  16. &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
  17. &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
  18. &lt;version&gt;1.7.29&lt;/version&gt;
  19. &lt;/dependency&gt;
  20. &lt;/dependencies&gt;

My objective is to code a logger using logback. My constraint was to develop this programmatically. I created a configuration class for my logger

  1. public class LogbackConfig {
  2. public static Logger getLogger(LoggerContext logCtx, String name) {
  3. Logger log = logCtx.getLogger(name);
  4. log.setAdditive(false);
  5. log.setLevel(Level.INFO);
  6. log.addAppender(getLogConsoleAppender(logCtx, getLogEncoder(logCtx)));
  7. log.addAppender(getLogFileAppender(logCtx, getLogEncoder(logCtx)));
  8. return log;
  9. }
  10. public static LoggerContext loggerContext() {
  11. LoggerContext logCtx = (LoggerContext) LoggerFactory.getILoggerFactory();
  12. PatternLayoutEncoder logEncoder = getLogEncoder(logCtx);
  13. ConsoleAppender&lt;ILoggingEvent&gt; consoleAppender = getLogConsoleAppender(logCtx, logEncoder);
  14. RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender = getLogFileAppender(logCtx, logEncoder);
  15. SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; triggeringPolicy = getTriggeringPolicy(logCtx, logFileAppender);
  16. FixedWindowRollingPolicy rollingPolicy = getRollingPolicy(logCtx, logFileAppender);
  17. return logCtx;
  18. }
  19. private static PatternLayoutEncoder getLogEncoder(LoggerContext loggerContext) {
  20. PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
  21. logEncoder.setContext(loggerContext);
  22. logEncoder.setPattern(&quot;%d{yyyy/MM/dd HH:mm:ss.SSS} | %-5logger{100} | %-5level | %C.%M\\(%F:%L\\) | %msg %n&quot;);
  23. logEncoder.start();
  24. return logEncoder;
  25. }
  26. private static ConsoleAppender&lt;ILoggingEvent&gt; getLogConsoleAppender(LoggerContext loggerContext, PatternLayoutEncoder logEncoder) {
  27. ConsoleAppender&lt;ILoggingEvent&gt; logConsoleAppender = new ConsoleAppender&lt;&gt;();
  28. logConsoleAppender.setContext(loggerContext);
  29. logConsoleAppender.setName(&quot;console&quot;);
  30. logConsoleAppender.setEncoder(logEncoder);
  31. logConsoleAppender.start();
  32. return logConsoleAppender;
  33. }
  34. private static RollingFileAppender&lt;ILoggingEvent&gt; getLogFileAppender(LoggerContext loggerContext, PatternLayoutEncoder logEncoder) {
  35. RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender = new RollingFileAppender&lt;ILoggingEvent&gt;();
  36. logFileAppender.setContext(loggerContext);
  37. logFileAppender.setName(&quot;logFile&quot;);
  38. logFileAppender.setEncoder(logEncoder);
  39. logFileAppender.setAppend(true);
  40. logFileAppender.setFile(&quot;logs/logfile.log&quot;);
  41. return logFileAppender;
  42. }
  43. private static SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; getTriggeringPolicy(LoggerContext loggerContext, RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender) {
  44. SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; triggeringPolicy = new SizeBasedTriggeringPolicy&lt;&gt;();
  45. triggeringPolicy.setContext(loggerContext);
  46. triggeringPolicy.setMaxFileSize(FileSize.valueOf(&quot;1MB&quot;));
  47. triggeringPolicy.start();
  48. logFileAppender.setTriggeringPolicy(triggeringPolicy);
  49. return triggeringPolicy;
  50. }
  51. private static FixedWindowRollingPolicy getRollingPolicy(LoggerContext loggerContext, RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender) {
  52. FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
  53. rollingPolicy.setContext(loggerContext);
  54. rollingPolicy.setParent(logFileAppender);
  55. rollingPolicy.setMinIndex(1);
  56. rollingPolicy.setMaxIndex(3);
  57. String rollingName = &quot;logs/log_%i.log&quot;;
  58. rollingPolicy.setFileNamePattern(rollingName);
  59. logFileAppender.setRollingPolicy(rollingPolicy);
  60. rollingPolicy.start();
  61. logFileAppender.start();
  62. return rollingPolicy;
  63. }
  64. }

And i can call this class anyware for example here :

  1. public class Main {
  2. public static void main(String[] args) {
  3. Logger log = LogbackConfig.getLogger(
  4. LogbackConfig.loggerContext(),
  5. MethodHandles.lookup().lookupClass().toString());
  6. for(int i = 0; i &lt; 10; i++) {
  7. log.warn(&quot;write in file ...&quot;);
  8. }
  9. Test test = new Test();
  10. test.testLog();
  11. }
  12. }

my test class just log some text. My issue is that i display correctly the information on the console. I also correctly create my log file but nothing is written.

答案1

得分: 0

  1. 我终于解决了这个问题
  2. public static Logger getLogger(String name) {
  3. LoggerContext logCtx = (LoggerContext) LoggerFactory.getILoggerFactory();
  4. PatternLayoutEncoder logEncoder = getPatternLayoutEncoder(logCtx);
  5. ConsoleAppender<ILoggingEvent> logConsoleAppender = getConsoleAppender(logCtx, logEncoder);
  6. // 两种不同的模式布局
  7. logEncoder = new PatternLayoutEncoder();
  8. logEncoder.setContext(logCtx);
  9. logEncoder.setPattern("%d{yyyy/MM/dd HH:mm:ss.SSS} | %-5logger{100} | %-5level | %C.%M\\(%F:%L\\) | %msg %n");
  10. logEncoder.start();
  11. RollingFileAppender<ILoggingEvent> logFileAppender = getRollingFileAppender(logCtx, logEncoder);
  12. SizeBasedTriggeringPolicy<ILoggingEvent> sizeBasedTriggeringPolicy = getSizeBasedTriggeringPolicy(logCtx);
  13. logFileAppender.setTriggeringPolicy(sizeBasedTriggeringPolicy);
  14. FixedWindowRollingPolicy logFilePolicy = getFixedWindowRollingPolicy(logCtx, logFileAppender);
  15. logFilePolicy.start();
  16. logFileAppender.start();
  17. Logger logger = logCtx.getLogger(name);
  18. logger.setAdditive(false);
  19. logger.setLevel(Level.INFO);
  20. logger.addAppender(logConsoleAppender);
  21. logger.addAppender(logFileAppender);
  22. return logger;
  23. }
  24. private static PatternLayoutEncoder getPatternLayoutEncoder(LoggerContext logCtx) {
  25. PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
  26. logEncoder.setContext(logCtx);
  27. logEncoder.setPattern("%d{yyyy/MM/dd HH:mm:ss.SSS} | %-5logger{100} | %-5level | %C.%M\\(%F:%L\\) | %msg %n");
  28. logEncoder.start();
  29. return logEncoder;
  30. }
  31. private static ConsoleAppender<ILoggingEvent> getConsoleAppender(LoggerContext logCtx, PatternLayoutEncoder logEncoder) {
  32. ConsoleAppender<ILoggingEvent> logConsoleAppender = new ConsoleAppender<>();
  33. logConsoleAppender.setContext(logCtx);
  34. logConsoleAppender.setName("console");
  35. logConsoleAppender.setEncoder(logEncoder);
  36. logConsoleAppender.start();
  37. return logConsoleAppender;
  38. }
  39. private static RollingFileAppender<ILoggingEvent> getRollingFileAppender(LoggerContext logCtx, PatternLayoutEncoder logEncoder) {
  40. RollingFileAppender<ILoggingEvent> logFileAppender = new RollingFileAppender<>();
  41. logFileAppender.setContext(logCtx);
  42. logFileAppender.setName("logFile");
  43. logFileAppender.setEncoder(logEncoder);
  44. logFileAppender.setAppend(true);
  45. logFileAppender.setFile("logs/logfile.log");
  46. return logFileAppender;
  47. }
  48. private static SizeBasedTriggeringPolicy<ILoggingEvent> getSizeBasedTriggeringPolicy(LoggerContext logCtx) {
  49. SizeBasedTriggeringPolicy<ILoggingEvent> sizeBasedTriggeringPolicy = new SizeBasedTriggeringPolicy<>();
  50. sizeBasedTriggeringPolicy.setContext(logCtx);
  51. sizeBasedTriggeringPolicy.setMaxFileSize(FileSize.valueOf("1Mb"));
  52. sizeBasedTriggeringPolicy.start();
  53. return sizeBasedTriggeringPolicy;
  54. }
  55. private static FixedWindowRollingPolicy getFixedWindowRollingPolicy(LoggerContext logCtx, RollingFileAppender<ILoggingEvent> logFileAppender) {
  56. FixedWindowRollingPolicy logFilePolicy = new FixedWindowRollingPolicy();
  57. logFilePolicy.setContext(logCtx);
  58. logFilePolicy.setParent(logFileAppender);
  59. logFilePolicy.setMinIndex(1);
  60. logFilePolicy.setMaxIndex(3);
  61. String rollingName = "logs/log_%i.log";
  62. logFilePolicy.setFileNamePattern(rollingName);
  63. logFileAppender.setRollingPolicy(logFilePolicy);
  64. logFilePolicy.start();
  65. return logFilePolicy;
  66. }
  67. 在主类中
  68. public class Main {
  69. public static void main(String[] args) {
  70. Logger log = LogbackConfig.getLogger(
  71. MethodHandles.lookup().lookupClass().toString());
  72. for(int i = 0; i < 10; i++) {
  73. log.warn("write in file ...");
  74. }
  75. Test test = new Test();
  76. test.testLog();
  77. }
  78. }
英文:

I finally solved this :

  1. public static Logger getLogger(String name) {
  2. LoggerContext logCtx = (LoggerContext) LoggerFactory.getILoggerFactory();
  3. PatternLayoutEncoder logEncoder = getPatternLayoutEncoder(logCtx);
  4. ConsoleAppender&lt;ILoggingEvent&gt; logConsoleAppender = getConsoleAppender(logCtx, logEncoder);
  5. // two different patterns layout
  6. logEncoder = new PatternLayoutEncoder();
  7. logEncoder.setContext(logCtx);
  8. logEncoder.setPattern(&quot;%d{yyyy/MM/dd HH:mm:ss.SSS} | %-5logger{100} | %-5level | %C.%M\\(%F:%L\\) | %msg %n&quot;);
  9. logEncoder.start();
  10. RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender = getRollingFileAppender(logCtx, logEncoder);
  11. SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; sizeBasedTriggeringPolicy = getSizeBasedTriggeringPolicy(logCtx);
  12. logFileAppender.setTriggeringPolicy(sizeBasedTriggeringPolicy);
  13. FixedWindowRollingPolicy logFilePolicy = getFixedWindowRollingPolicy(logCtx, logFileAppender);
  14. logFilePolicy.start();
  15. logFileAppender.start();
  16. Logger logger = logCtx.getLogger(name);
  17. logger.setAdditive(false);
  18. logger.setLevel(Level.INFO);
  19. logger.addAppender(logConsoleAppender);
  20. logger.addAppender(logFileAppender);
  21. return logger;
  22. }
  23. private static PatternLayoutEncoder getPatternLayoutEncoder(LoggerContext logCtx) {
  24. PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
  25. logEncoder.setContext(logCtx);
  26. logEncoder.setPattern(&quot;%d{yyyy/MM/dd HH:mm:ss.SSS} | %-5logger{100} | %-5level | %C.%M\\(%F:%L\\) | %msg %n&quot;);
  27. logEncoder.start();
  28. return logEncoder;
  29. }
  30. private static ConsoleAppender&lt;ILoggingEvent&gt; getConsoleAppender(LoggerContext logCtx, PatternLayoutEncoder logEncoder) {
  31. ConsoleAppender&lt;ILoggingEvent&gt; logConsoleAppender = new ConsoleAppender&lt;&gt;();
  32. logConsoleAppender.setContext(logCtx);
  33. logConsoleAppender.setName(&quot;console&quot;);
  34. logConsoleAppender.setEncoder(logEncoder);
  35. logConsoleAppender.start();
  36. return logConsoleAppender;
  37. }
  38. private static RollingFileAppender&lt;ILoggingEvent&gt; getRollingFileAppender(LoggerContext logCtx, PatternLayoutEncoder logEncoder) {
  39. RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender = new RollingFileAppender&lt;&gt;();
  40. logFileAppender.setContext(logCtx);
  41. logFileAppender.setName(&quot;logFile&quot;);
  42. logFileAppender.setEncoder(logEncoder);
  43. logFileAppender.setAppend(true);
  44. logFileAppender.setFile(&quot;logs/logfile.log&quot;);
  45. return logFileAppender;
  46. }
  47. private static SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; getSizeBasedTriggeringPolicy(LoggerContext logCtx) {
  48. SizeBasedTriggeringPolicy&lt;ILoggingEvent&gt; sizeBasedTriggeringPolicy = new SizeBasedTriggeringPolicy&lt;&gt;();
  49. sizeBasedTriggeringPolicy.setContext(logCtx);
  50. sizeBasedTriggeringPolicy.setMaxFileSize(FileSize.valueOf(&quot;1Mb&quot;));
  51. sizeBasedTriggeringPolicy.start();
  52. return sizeBasedTriggeringPolicy;
  53. }
  54. private static FixedWindowRollingPolicy getFixedWindowRollingPolicy(LoggerContext logCtx, RollingFileAppender&lt;ILoggingEvent&gt; logFileAppender) {
  55. FixedWindowRollingPolicy logFilePolicy = new FixedWindowRollingPolicy();
  56. logFilePolicy.setContext(logCtx);
  57. logFilePolicy.setParent(logFileAppender);
  58. logFilePolicy.setMinIndex(1);
  59. logFilePolicy.setMaxIndex(3);
  60. String rollingName = &quot;logs/log_%i.log&quot;;
  61. logFilePolicy.setFileNamePattern(rollingName);
  62. logFileAppender.setRollingPolicy(logFilePolicy);
  63. logFilePolicy.start();
  64. return logFilePolicy;
  65. }

And in the main :

  1. public class Main {
  2. public static void main(String[] args) {
  3. Logger log = LogbackConfig.getLogger(
  4. MethodHandles.lookup().lookupClass().toString());
  5. for(int i = 0; i &lt; 10; i++) {
  6. log.warn(&quot;write in file ...&quot;);
  7. }
  8. Test test = new Test();
  9. test.testLog();
  10. }
  11. }

huangapple
  • 本文由 发表于 2020年10月6日 15:43:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/64221359.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定