Log4J – 运行时变量替换

2024-02-16

Log4J http://logging.apache.org/log4j/1.2/index.html似乎有一个恼人的限制——在运行时,变量替换似乎不起作用。

在这个例子中

文件:Log4j.properties

file_pattern=%d{ISO8601} %-5p %m%n

log4j.rootLogger=调试,FileAppender

log4j.appender.FileAppender=org.apache.log4j.FileAppender log4j.appender.FileAppender.layout=org.apache.log4j.PatternLayout log4j.appender.FileAppender.layout.ConversionPattern=${file_pattern} log4j.appender.FileAppender.File=log4jtest1.log

log4j.appender.FileAppender.Threshold=错误

log4j.properties 文件中配置的 FileAppender 会生成正确的输出:

文件:log4jtest1.log

错误 错误消息示例 FATAL 致命消息示例

如果我尝试在运行时创建 FileAppender

import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class Main {
    static final Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {

        FileAppender appender = new FileAppender();
        appender.setFile("log4test2.log");

        PatternLayout pl = new PatternLayout("${file_pattern}");

        appender.setLayout(pl);
        appender.setName("log4jtest2");
        appender.setThreshold(Level.ERROR);
        appender.activateOptions(); 
        logger.addAppender(appender);

        logger.trace("Sample trace message");
        logger.debug("Sample debug message");
        logger.info("Sample info message");
        logger.warn("Sample warn message");
        logger.error("Sample error message");
        logger.fatal("Sample fatal message");
    }
}

Te 输出为

文件:log4jtest2.log

${文件模式}${文件模式}

谁能解释一下问题是什么以及如何解决?

相关问题:应用程序可以访问 ResourceBundle 以读取要替换的变量吗?


变量替换的特点是属性配置器 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html不是 PatternLayout 的。如果你查看你的代码,你永远不会定义 file_pattern 应该是什么。但为什么需要在代码中进行变量替换呢?只需这样做:

 PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");

如果您想在其他地方引用该字符串,只需将其设为常量即可。

编辑:您必须读取属性对象,但 PropertyConfigurator 可以采用属性对象而不是文件,因此您可以加载该对象,执行您需要执行的操作并将其传递给 PropertiesConfigurator,因此您只有一个配置路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4J – 运行时变量替换 的相关文章

随机推荐

  • 跨源请求被阻止

    所以我有这个 Go http 处理程序 它将一些 POST 内容存储到数据存储中 并检索一些其他信息作为响应 在后端我使用 func handleMessageQueue w http ResponseWriter r http Reque
  • Django 表单 - 附加到类元排除和小部件

    是否可以附加到继承表单的排除或小部件变量 到目前为止我已经进行了以下设置 class AddPropertyForm forms ModelForm num months forms ChoiceField choices MONTHS r
  • Eclipse 中的 ScalaTest 运行配置:找不到 Suite 类

    问题 我无法设置运行配置来为项目中的 Scalatest 运行 scalatest 重现步骤 右键单击 Scala Suite 然后单击 运行方式 gt 运行配置 在左侧 我看到了 ScalaTest 的配置模板 我单击 新建 并填写名称但
  • 如何将分层数据数据绑定到 WPF TreeView?

    该类型如下所示 class Category public string Name public string Message public ObservableCollection
  • 升级到 android sdk tools 20/platform sdk tools 12 后无法再启动应用程序

    我升级了我的 sdk 工具 现在我无法再从 Eclipse 启动应用程序 我仍然可以从命令行安装 当我启动时 我收到一个错误窗口和一个空的设备选择器 错误窗口显示 An error has occurred See error log fo
  • Google 日历 - 找不到请求的活动

    我在 Google 日历中创建了活动 然后将其发布到网站上 作为 Google 日历中的 HTML 代码 活动网址 单击 URL 后 它会将我重定向到 Google 日历 其中包含以下文本 找不到请求的事件 应该是什么问题呢 我希望人们应该
  • 在预排序的 DataFrame 上使用 pandas groupby 进行迭代顺序

    情况 我根据特定列中的值使用特定分类器对 DataFrame 中的行进行分类 我的目标是根据特定条件将结果附加到一个新列或另一列 代码看起来像这样 df pd DataFrame A list with classifier ids Onl
  • Android,ArrayAdapter的add()函数不起作用

    我有一个附加到 AutoCompleteTextView textView 组件的 ArrayAdapter myAdapter 一旦用户按下一个字符 我想用包含该字符的项目填充 AutoCompleteTextView 的下拉列表 我使用
  • 了解汇编中的 JMP 代码

    我最近刚刚触及汇编语言和调试的表面 我有以下代码 Address Hex dump Command Comments 006E3689 E8 C5F9FFFF CALL 006E3053 gt 006E368E E9 DB E9 gt 00
  • 如何更有效地通过 http 下载大文件?

    我正在尝试在 Kotlin 中下载大文件 这个问题 除了我使用 Kotlin 而不是 java 语法略有不同 val client OkHttpClient val request Request Builder url urlString
  • 什么是 JavaScript >>> 运算符以及如何使用它?

    我正在查看 Mozilla 中向 Array 添加过滤方法的代码 其中有一行代码让我感到困惑 var len this length gt gt gt 0 我以前从未见过在 JavaScript 中使用 gt gt gt 它是什么以及它有什
  • Pgadmin4 中的“加密密钥丢失”错误是什么以及如何解决?

    我正在使用 pgadmin 版本 6 1 我正在尝试使用本地计算机上的 pgadmin 连接到托管在 docker 中的 postgres 数据库 我使用以下命令来获取 docker 容器的 IP 地址 docker检查 f range N
  • iOS 中如何将地图区域限制为一个国家/地区?

    我正在使用mapkit 为iOS 制作一个应用程序 我想将地图的边界限制为特定的地区 国家 有没有办法做到这一点 无法告诉地图不要滚动到某个区域之外 我能想到的唯一方法是当您撞到栅栏之一时阻止用户滚动 下面的示例是在没有测试或编译的情况下编
  • WP7 模拟器浏览器不显示任何内容

    我使用 webbrowser 控件显示应用程序中的网页 但它只显示白屏 我尝试了 Internet Explorer 但它也没有显示任何内容 任何想法如何解决这个问题 预先非常感谢 Windows Phone 模拟器需要具有 DirectX
  • 如何使用OpenCV中的convertScaleAbs()函数?

    我试图在应用索贝尔过滤后将图像转换回灰度 我有以下代码 import numpy as np import matplotlib pyplot as plt import cv2 image cv2 imread train jpg img
  • 出于安全原因,escapeshellarg() 已被禁用

    当我想以任何形式上传任何内容时 我会看到警告 出于安全原因 escapeshellarg 已被禁用在我的网站上留言 我可以做什么来解决这个问题 我的框架是 codeigniter 最终版本 这是完整的警告 A PHP Error was e
  • 垂直可滚动组件的测量具有无限大的最大高度限制,这是不允许的

    我在 recyclerview 项目布局中使用 ComposeView 来与 jetpack compose 一起使用 当我打开屏幕时遇到奇怪的问题 Error java lang IllegalStateException Vertica
  • 选择元素上的 IE6/IE7 css 边框

    有谁有使用 CSS 来设置 Internet Explorer 中 选择 元素边框样式的解决方案吗 据我所知 这在 IE 中是不可能的 因为它使用操作系统组件 这里有一个link http v2 easy designs net artic
  • mysql错误1451

    我有 mysql 错误 代码为 1451 无法删除或更新父行 外键约束失败 online store admin osa admin logs 约束fk admins logs外键 aid 参考osa admins aid 这里sql语句
  • Log4J – 运行时变量替换

    Log4J http logging apache org log4j 1 2 index html似乎有一个恼人的限制 在运行时 变量替换似乎不起作用 在这个例子中 文件 Log4j properties file pattern d I