如何将Log4j.xml转换为Log4j2.properties(重写策略)

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

How to convert Log4j.xml to Log4j2.properties (Rewrite Polici)

问题

我想使用“Rewrite Policy”来处理日志中的某些条件,比如掩码,然后我在log4j2.xml中找到了解决方案,但我们通常使用log4j2.properties来进行基本配置,我已经尝试配置了,但重写仍然不起作用。

其他配置如下:

  1. <Configuration status="warn" name="MyApp" packages="">
  2. <Properties>
  3. <Property name="LOG_DIR">/logs</Property>
  4. </Properties>
  5. <Appenders>
  6. <RollingFile
  7. name="rollingFile"
  8. fileName="D:/logs/omnichannel/application.log"
  9. filePattern="D:/logs/omnichannel/application.%i.log.gz"
  10. ignoreExceptions="false">
  11. <PatternLayout>
  12. <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n</Pattern>
  13. </PatternLayout>
  14. <Policies>
  15. <SizeBasedTriggeringPolicy size="10MB" />
  16. </Policies>
  17. <DefaultRolloverStrategy max="5">
  18. <Delete basePath="D:/logs/" maxDepth="2">
  19. <IfFileName glob="*/app-*.log.gz" />
  20. <IfLastModified age="P30D" />
  21. </Delete>
  22. </DefaultRolloverStrategy>
  23. </RollingFile>
  24. <Console name="STDOUT" target="SYSTEM_OUT" ignoreExceptions="false">
  25. <PatternLayout pattern="%m%n"/>
  26. </Console>
  27. <Rewrite name="Rewrite">
  28. <LogInterceptor />
  29. <AppenderRef ref="rollingFile"/>
  30. </Rewrite>
  31. </Appenders>
  32. <Loggers>
  33. <Root level="info">
  34. <AppenderRef ref="Rewrite"/>
  35. </Root>
  36. </Loggers>
  37. </Configuration>

而我的配置如下:

  1. status = warn
  2. name= PropertiesConfig
  3. # 指定存储日志文件的目录路径
  4. property.basePath = D://logs//
  5. appenders = rolling, console, Rewrite
  6. appender.Rewrite.type = Rewrite
  7. appender.Rewrite.name = Rewrite
  8. appender.Rewrite.layout.type = LogInterceptor
  9. appender.Rewrite.layout.RewriteAppender = fileLogger
  10. # ConsoleAppender 会将日志打印到控制台
  11. appender.console.type = Console
  12. appender.console.name = consoleLogger
  13. appender.console.target = SYSTEM_OUT
  14. appender.console.layout.type = PatternLayout
  15. # 指定日志的格式
  16. appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight{[%-5level]}{TRACE=magenta} %mask %logger{36}.%M(%L) : %msg%n%throwable
  17. appender.console.layout.disableAnsi=false
  18. # RollingFileAppender 会将日志记录到文件中,并根据时间或大小进行轮换
  19. appender.rolling.type = RollingFile
  20. appender.rolling.name = fileLogger
  21. appender.rolling.fileName = ${basePath}${hostName}.log
  22. appender.rolling.filePattern = ${basePath}${hostName}_%d{yyyy-MM-dd}-%i.log.gz
  23. appender.rolling.layout.type = PatternLayout
  24. appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}.%M(%L) : %msg%n%throwable
  25. appender.rolling.policies.type = Policies
  26. # 每天轮换日志文件,并保留30天的日志
  27. appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
  28. appender.rolling.policies.time.interval = 1
  29. appender.rolling.strategy.type = DefaultRolloverStrategy
  30. appender.rolling.strategy.action.type = Delete
  31. appender.rolling.strategy.action.basePath = ${basePath}
  32. appender.rolling.strategy.action.maxDepth = 1
  33. appender.rolling.strategy.action.ifLastModified.type = IfLastModified
  34. appender.rolling.strategy.fileIndex = nomax
  35. loggers = application, httpclient, Client
  36. # 指定要记录的包名。此包及其子包中的类将使用ConsoleAppender和RollingFileAppender记录日志
  37. logger.application.name = com.project
  38. logger.application.level = info
  39. logger.application.appenderRefs = rolling
  40. logger.application.appenderRef.rolling.ref = fileLogger
  41. logger.httpclient.name = org.apache.http
  42. logger.httpclient.level = info
  43. logger.httpclient.appenderRefs = rolling
  44. logger.httpclient.appenderRef.rolling.ref = fileLogger
  45. logger.Client.name = com.sun.jersey.api
  46. logger.Client.level = info
  47. logger.Client.appenderRefs = rolling
  48. logger.Client.appenderRef.rolling.ref = fileLogger
  49. rootLogger.level = info
  50. rootLogger.appenderRefs = Rewrite
  51. rootLogger.appenderRef.Rewrite.ref = Rewrite

请注意,重写策略在上述配置中使用了<Rewrite>标签,而您的配置使用了appender.Rewrite来定义它。您需要确保您的配置文件与示例中的格式一致,才能使重写策略正常工作。希望这有助于解决您的问题。如果您仍然遇到问题,请提供更多详细信息以便进一步帮助您。

英文:

i want to use Rewrite Policy for some condition in logging like masking, and then I found the solution but in log4j2.xml, however we use log4j2.properties for base config, I already try to config but the rewrite still not working.

here other config compare to my config

Other Config :

  1. &lt;Configuration status=&quot;warn&quot; name=&quot;MyApp&quot; packages=&quot;&quot;&gt;
  2. &lt;Properties&gt;
  3. &lt;Property name=&quot;LOG_DIR&quot;&gt;/logs&lt;/Property&gt;
  4. &lt;/Properties&gt;
  5. &lt;Appenders&gt;
  6. &lt;RollingFile
  7. name=&quot;rollingFile&quot;
  8. fileName=&quot;D:/logs/omnichannel/application.log&quot;
  9. filePattern=&quot;D:/logs/omnichannel/application.%i.log.gz&quot;
  10. ignoreExceptions=&quot;false&quot;&gt;
  11. &lt;PatternLayout&gt;
  12. &lt;Pattern&gt;%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n&lt;/Pattern&gt;
  13. &lt;/PatternLayout&gt;
  14. &lt;Policies&gt;
  15. &lt;SizeBasedTriggeringPolicy size=&quot;10MB&quot; /&gt;
  16. &lt;/Policies&gt;
  17. &lt;DefaultRolloverStrategy max=&quot;5&quot;&gt;
  18. &lt;Delete basePath=&quot;D:/logs/&quot; maxDepth=&quot;2&quot;&gt;
  19. &lt;IfFileName glob=&quot;*/app-*.log.gz&quot; /&gt;
  20. &lt;IfLastModified age=&quot;P30D&quot; /&gt;
  21. &lt;/Delete&gt;
  22. &lt;/DefaultRolloverStrategy&gt;
  23. &lt;/RollingFile&gt;
  24. &lt;Console name=&quot;STDOUT&quot; target=&quot;SYSTEM_OUT&quot; ignoreExceptions=&quot;false&quot;&gt;
  25. &lt;PatternLayout pattern=&quot;%m%n&quot;/&gt;
  26. &lt;/Console&gt;
  27. &lt;Rewrite name=&quot;Rewrite&quot;&gt;
  28. &lt;LogInterceptor /&gt;
  29. &lt;AppenderRef ref=&quot;rollingFile&quot;/&gt;
  30. &lt;/Rewrite&gt;
  31. &lt;/Appenders&gt;
  32. &lt;Loggers&gt;
  33. &lt;Root level=&quot;info&quot;&gt;
  34. &lt;AppenderRef ref=&quot;Rewrite&quot;/&gt;
  35. &lt;/Root&gt;
  36. &lt;/Loggers&gt;
  37. &lt;/Configuration&gt;

And my config here :

  1. status = warn
  2. name= PropertiesConfig
  3. # Give directory path where log files should get stored
  4. property.basePath = D://logs//
  5. appenders = rolling, console, Rewrite
  6. appender.Rewrite.type = Rewrite
  7. appender.Rewrite.name = Rewrite
  8. appender.Rewrite.layout.type = LogInterceptor
  9. appender.Rewrite.layout.RewriteAppender = fileLogger
  10. # ConsoleAppender will print logs on console
  11. appender.console.type = Console
  12. appender.console.name = consoleLogger
  13. appender.console.target = SYSTEM_OUT
  14. appender.console.layout.type = PatternLayout
  15. # Specify the pattern of the logs
  16. appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight{[%-5level]}{TRACE=magenta} %mask %logger{36}.%M(%L) : %msg%n%throwable
  17. appender.console.layout.disableAnsi=false
  18. # RollingFileAppender will print logs in file which can be rotated based on time or size
  19. appender.rolling.type = RollingFile
  20. appender.rolling.name = fileLogger
  21. appender.rolling.fileName = ${basePath}${hostName}.log
  22. appender.rolling.filePattern = ${basePath}${hostName}_%d{yyyy-MM-dd}-%i.log.gz
  23. appender.rolling.layout.type = PatternLayout
  24. appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}.%M(%L) : %msg%n%throwable
  25. appender.rolling.policies.type = Policies
  26. # Rotate log file each day and keep 30 days worth
  27. appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
  28. appender.rolling.policies.time.interval = 1
  29. appender.rolling.strategy.type = DefaultRolloverStrategy
  30. appender.rolling.strategy.action.type = Delete
  31. appender.rolling.strategy.action.basePath = ${basePath}
  32. appender.rolling.strategy.action.maxDepth = 1
  33. appender.rolling.strategy.action.ifLastModified.type = IfLastModified
  34. appender.rolling.strategy.fileIndex = nomax
  35. # For hibernate tracing query parameter, make this default not opened
  36. #loggers = application, hibernate
  37. loggers = application, httpclient, Client
  38. # Mention package name here. Classes in this package or sub packages will use ConsoleAppender and RollingFileAppender for logging
  39. logger.application.name = com.project
  40. logger.application.level = info
  41. logger.application.appenderRefs = rolling
  42. logger.application.appenderRef.rolling.ref = fileLogger
  43. logger.httpclient.name = org.apache.http
  44. logger.httpclient.level = info
  45. logger.httpclient.appenderRefs = rolling
  46. logger.httpclient.appenderRef.rolling.ref = fileLogger
  47. logger.Client.name = com.sun.jersey.api
  48. logger.Client.level = info
  49. logger.Client.appenderRefs = rolling
  50. logger.Client.appenderRef.rolling.ref = fileLogger
  51. # For hibernate tracing query parameter, make this default not opened
  52. #logger.hibernate.name = org.hibernate.type
  53. #logger.hibernate.level = trace
  54. #Logger.hibernate.Additivity = false
  55. # Configure root logger for logging error logs in classes which are in package other than above specified package
  56. rootLogger.level = info
  57. rootLogger.appenderRefs = Rewrite
  58. rootLogger.appenderRef.Rewrite.ref = Rewrite

my function rewrite :

  1. @Plugin(name = &quot;LogInterceptor&quot;, category = &quot;Core&quot;, elementType = &quot;rewritePolicy&quot;, printObject = true)
  2. public class LoggingMaskingConverter implements RewritePolicy {
  3. protected static final Logger log = LogManager.getLogger(LoggingMaskingConverter.class);
  4. private static final List&lt;String&gt; loggingSetting = Arrays.asList(&quot;pin,password&quot;.split(&quot;,&quot;));
  5. private static final String loggingMasking = &quot;1&quot;;
  6. private static final List&lt;String&gt; excludePath = Collections.emptyList();
  7. private static final String STR_BODY = &quot;body=[&quot;;
  8. Properties prop = new Properties();
  9. @PluginFactory
  10. public static LoggingMaskingConverter createPolicy() {
  11. return new LoggingMaskingConverter();
  12. }
  13. @Override
  14. public LogEvent rewrite(LogEvent event) {
  15. if (event.getLoggerName().contains(&quot;com.project&quot;)) {
  16. Message outputMessage = logInfoMasking(event.getMessage());
  17. return new Log4jLogEvent.Builder(event).setMessage(outputMessage).build();
  18. } else {
  19. return new Log4jLogEvent.Builder(event).build();
  20. }
  21. }
  22. public Message logInfoMasking(Message message) {
  23. StringBuilder stringBuilder = new StringBuilder();
  24. try {
  25. String body = message.getFormattedMessage();
  26. ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
  27. if (StringUtils.isNotBlank(loggingMasking) &amp;&amp; loggingMasking.equalsIgnoreCase(&quot;1&quot;)) {
  28. if (body != null) {
  29. Collection&lt;String&gt; whitelist = loggingSetting;
  30. Collection&lt;String&gt; excludeKeys = excludePath;
  31. JsonMasker masker = new JsonMasker(whitelist, excludeKeys);
  32. JsonNode jsonNode = new ObjectMapper().readTree(body);
  33. JsonNode masked = masker.mask(jsonNode);
  34. stringBuilder.append(STR_BODY + masked.toString() + &quot;]&quot;);
  35. }
  36. } else {
  37. String json = ow.writeValueAsString(body);
  38. stringBuilder.append(STR_BODY + json + &quot;]&quot;);
  39. }
  40. } catch (JsonProcessingException e) {
  41. log.error(e, e);
  42. }
  43. return new ObjectMessage(stringBuilder.toString());
  44. }
  45. }

i spend my time around one day to solve this. until this day. the rewrite still not working in logs file but in my function rewrite going well

答案1

得分: 1

配置Log4j2组件的一般格式是通过属性进行配置的:

  1. <parent_component_prefix>.<arbitrary_id>.type = ComponentType
  2. <parent_component_prefix>.<arbitrary_id>.property1 = value1
  3. ...

因此,在您的情况下,您需要:

  1. appender.$0.type = Rewrite
  2. appender.$0.name = Rewrite
  3. appender.$0.$1.type = LogInterceptor
  4. appender.$0.$2.type = AppenderRef
  5. appender.$0.$2.ref = fileLogger
英文:

The general format to configure a Log4j2 component via properties is:

  1. &lt;parent_component_prefix&gt;.&lt;arbitrary_id&gt;.type = ComponentType
  2. &lt;parent_component_prefix&gt;.&lt;arbitrary_id&gt;.property1 = value1
  3. ...

So in your case you need:

  1. appender.$0.type = Rewrite
  2. appender.$0.name = Rewrite
  3. appender.$0.$1.type = LogInterceptor
  4. appender.$0.$2.type = AppenderRef
  5. appender.$0.$2.ref = fileLogger

huangapple
  • 本文由 发表于 2023年2月8日 13:04:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/75381552.html
匿名

发表评论

匿名网友

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

确定