Log4j2 系统属性写入文件

2024-02-14

我使用以下 log4j2 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5.5level %-60.60logger - %msg%n" />
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT"
                    onMismatch="DENY" />
            </Filters>
        </Console>
        <RollingFile name="RollingFile"
            fileName="${sys:log.file}"
            filePattern="${sys:log.parent.path}\$${date:yyyy-MM}\${sys:log.file.name}-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <Pattern>
                    %d{yyy-MM-dd HH:mm:ss.SSS} [%30.30t]%-10.10level%-60.60logger - %msg%n
                </Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="60 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="RollingFile" />
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

当文件位置作为命令行参数传递时,系统参数被设置,然后函数 reconfigureLog() 设置属性

public static void reconfigureLog(String logPath)
    {
        File logFile = new File(logPath);
        System.setProperty("log.file", logPath);
        System.setProperty("log.parent.path", logFile.getParent());
        System.setProperty("log.file.name", FilenameUtils.getBaseName(logFile.getName()));

        org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) LogManager
                .getRootLogger();
        LoggerContext context = rootLogger.getContext();
        context.reconfigure();
    }

这是我从命令行读取参数然后再设置的场景的示例用法。

if (cmd.hasOption("logFile"))
        {
            String logPath = cmd.getOptionValue("logFile");
            Utility.reconfigureLog(logPath);
            logger = LogManager.getLogger(Test.class);
        }

每个类都有一个静态记录器初始化,如下所示:

private final static Logger logger = LogManager.getLogger(Connector.class);

问题是当我运行应用程序时,${sys.log.file}正在创建,然后根据参数创建相应的日志文件。通过参数摸索,似乎RolllingFile下的参数fileName是自动添加的。

log4j2的调试日志是:

2015-12-03 11:07:19,204 main DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile with params(fileName="${sys:log.file}", filePattern="${sys:log.parent.path}\${date:yyyy-MM}\${sys:log.file.name}-%d{MM-dd-yyyy}-%i.log.gz", append="null", name="RollingFile", bufferedIO="null", bufferSize="null", immediateFlush="null", Policies(CompositeTriggeringPolicy(policies=[TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=false), SizeBasedTriggeringPolicy(size=62914560)])), null, PatternLayout(%d{yyy-MM-dd HH:mm:ss.SSS} [%30.30t]%-10.10level%-60.60logger - %msg%n), null, ignoreExceptions="null", advertise="null", advertiseURI="null", Configuration(<path>\Connector\target\classes\log4j2.xml))
2015-12-03 11:07:19,207 main DEBUG Starting RollingFileManager ${sys:log.file}

可以看出,系统参数是按字面意思选取的,而不是替换的。我需要避免早期初始化并仅在调用 reconfigureLog 方法后才开始加载。 我怎样才能避免${sys.log.file}当我可以使用系统参数作为我的应用程序的一部分时创建?


TL;DR

只需将 ${sys:value} 查找替换为 ${main:--value} 查找即可。

解释

http://logging.apache.org/log4j/2.x/manual/lookups.html#AppMainArgsLookup http://logging.apache.org/log4j/2.x/manual/lookups.html#AppMainArgsLookup

将此功能与配置属性结合起来

http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution

您可以使用参数进行一些非常强大的配置,而无需接触代码。

请密切关注 PropertySubstitution 文档中的这一点。

如果在与该关联的查找中没有找到该键的值 前缀是与属性中的键关联的值 将使用配置文件中的声明。如果没有值 发现变量声明将作为值返回。默认 可以通过执行以下操作在配置中声明值:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Properties>
    <Property name="--file">log_file_path</property>
  </Properties>
  ...
</Configuration>

这意味着像这样的配置查找${main:--file}将返回命令行参数 --file 如果存在,但如果不存在,则会返回属性声明中的默认值(我不确定属性的名称是否需要为“file”或“--file”才能正确匹配)。如果您的目标是在启动时简单地通过参数设置日志文件,则不需要代码。

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

Log4j2 系统属性写入文件 的相关文章

  • 如何在 IDEA Intellij 上使用 Spring-boot 自动重新加载

    我写了一个基于Spring boot tomcat freemarker的项目 我运行成功 但是每当我修改一些模板和java类时 我必须重新启动服务器或使用Intellij上的 重新加载更改的类 菜单才能使更改生效 浪费很多时间 然后我尝试
  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 最快的高斯模糊实现

    如何以最快的速度实施高斯模糊 http en wikipedia org wiki Gaussian blur算法 我要用Java来实现它 所以GPU http en wikipedia org wiki Graphics processi
  • 查询 MongoDB 集合中的字段。

    我正在尝试查询 mongodb 集合中的特定字段 这是我的代码和输出 Mongo m new Mongo DB db m getDB mydb DBCollection coll db getCollection student addin
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 本地开发的 Azure Functions 扩展包版本问题

    我有一个带有队列触发器的 Java 11 Azure 函数 该函数在部署到 Azure 时按预期工作 并正确从定义的服务总线主题中提取消息 但是 运行相同的功能locally除非我回滚版本 否则不起作用Azure Functions 绑定扩
  • 使用 Spring 控制器处理错误 404

    I use ExceptionHandler处理我的网络应用程序抛出的异常 在我的例子中我的应用程序返回JSON回应HTTP status用于对客户端的错误响应 但是 我正在尝试弄清楚如何处理error 404返回与处理的类似的 JSON
  • 无法访问“不安全”java方法的java表达式语言

    我正在开发一个项目 让用户向服务器提交小 脚本 然后我将执行这些脚本 有很多脚本语言可以嵌入到Java程序中 例如mvel ognl uel clojure rhino javascript等 但是 据我所知 它们都允许脚本编写者调用Jav
  • 我需要在 JFileChooser(打开模式)中显示不带扩展名的文件名。如何?

    我在打开模式下使用 JFileChooser 我需要显示不带扩展名的 文件名 字段 如何 我知道文件视图 它删除文件系统文件中的扩展名 但将所选文件中的扩展名保留在 文件名 字段中解释 http saveimg ru show image
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 插入时的 iBatis 判别器

    我有一个抽象类Example以及与之相伴的具体子类 我使用鉴别器来提取数据out数据库的 像这样
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 删除 JFX 中选项卡后面的灰色背景

    So is there any way to remove the gray area behind the tab s 我尝试过用 CSS 来做到这一点 但没有找到方法 要设置 tabpane 标题的背景颜色 请在 CSS 文件中写入 t
  • java.lang.IllegalStateException - 提交响应后无法创建会话

    我在我的项目中使用 JSF PrimeFaces 我为此准备了一个Maven项目 当我编译项目并加载主页后 我收到以下异常 java lang IllegalStateException Cannot create a session af

随机推荐

  • React Native - SQLite 找不到预填充的数据库文件

    我正在尝试使用https github com andpor react native sqlite storage https github com andpor react native sqlite storage对于 SQLite
  • 我们如何在没有第三个变量和算术运算符的情况下交换两个数字?

    我们如何在没有第三个变量和算术运算符的情况下交换两个数字 XOR算不算算术运算符 如果没有 那么 X X XOR Y Y X XOR Y X X XOR Y 将此伪代码转换为可编译的 Java 代码作为练习留给读者 关于 java 标签
  • docker-compose如何引用其他目录中的文件

    有这个 dockerfile FROM python 3 8 3 alpine ENV MICRO SERVICE home app microservice RUN addgroup S APP USER adduser S APP US
  • CordovaWebView 与 android 中的 onBackPressed 方法混淆

    正如标题所说CordovaWebView and onBackPressed在 android 中组合起来会产生奇怪的结果 我有混合应用程序 我的主要活动有DrawerLayout and CordovaWebView 我的 onBackP
  • android ndk数据保存/加载

    我正在致力于将 PC OpenGL 应用程序移植到 Android 上 我选择使用 NDK android native app glue 框架 据我了解 它允许我继续使用 C 甚至不编写任何 JAVA 代码行 听起来很有希望 对我来说第一
  • 将加密的 csv 导入 Python 3

    因此 我计划使用 Jupyter Notebook Python 3 进行一些数据分析 出于协作原因 我想将数据存储在 github 存储库上 但数据集很敏感 因此 我想将数据 当前为 csv 作为加密文件存储在存储库上 然后在运行时解密
  • .NET ORM、不可变值对象、结构、默认构造函数和只读属性

    我刚刚开始使用 NET ORM 甚至还没有在 Entity Framework 和 NHibernate 之间做出决定 但在这两种情况下 我都遇到了一个问题 因为他们似乎希望我以各种方式损害域模型的完整性 特别是在 C 对象设计的更精细的方
  • (numpy) __array_wrap__ 有什么作用?

    我第一次深入 SciPy LinAlg 模块 我看到了这个函数 def makearray a new asarray a wrap getattr a array prepare new array wrap return new wra
  • 'quietly = TRUE' 何时在 require() 函数中真正起作用?

    我正在尝试编写一组函数来检查丢失的 R 软件包 并在必要时安装它们 StackOverflow 上有一些很好的代码可以做到这一点 从这里开始 https stackoverflow com questions 4090169 elegant
  • 在更改视图的可见性时应用动画

    我的应用程序中有一个 Horizo ntalScrollView 并且我经常使用它的可见性 可见和消失 所以我想要的是 我可以应用某种动画或其他东西 使其开始以滑动的方式变得可见和不可见 而不是突然使其可见和不可见吗 任何帮助或建议将不胜感
  • 本地主机上的 Django/Celery 多个队列 - 路由不起作用

    我跟着芹菜docs http celery readthedocs org en latest userguide routing html manual routing在我的开发机器上定义 2 个队列 我的芹菜设置 CELERY ALWA
  • 从 Eclipse 中删除插件的正确方法

    上次 我遇到了从 Eclipse 中删除插件的问题 症状 1 如果删除通过已安装菜单 无法正确重新安装并且有多个视角 例如对于 SQL 资源管理器 在Open Perspective menu 2 如果通过文件系统删除 手动从plugins
  • 人员 API 谷歌配额限制

    我正在研究 People API 这仅适用于 google 用户 有人知道吗 我一天 分钟可以免费询问多少次 一般配额限制是多少 超过门槛需要花费多少钱 Thanks 有两种不同的 People API 您可以在云控制台中查看两者的配额 G
  • 具有基本身份验证的 Webclient / HttpWebRequest 返回 404 未找到有效 URL

    编辑 我想回来指出问题根本不在我这边 而是与另一家公司的代码有关 我正在尝试使用基本身份验证来打开页面 我不断收到 404 页面未找到错误 我可以将我的网址复制并粘贴到浏览器中 它工作正常 如果我尚未登录他们的网站 它会弹出一个凭据框 否则
  • ASP.NET Core 默认调试启动 URL

    使用 ASP NET Core Web API 模板时 默认调试启动 URL 以某种方式设置为api values 此默认配置在哪里以及如何更改它 我能找到的有关此启动 URL 声明位置的文档非常少 这个里面有简短的提及博客文章 https
  • vuelidate 异步验证器 - 如何去抖?

    因此 我的电子邮件 用户表单元素上的异步验证器存在问题 每次输入字母时 它都会检查有效性 如果电子邮件有 30 个字符 那么就超过 30 个电话 有人知道消除 vuelidate 自定义验证器的最佳方法吗 当我尝试使用 debounce 时
  • 传统 For 循环与增强型 For 循环 [重复]

    这个问题在这里已经有答案了 这段代码 import java util import java io class TestClass public static void main String args throws Exception
  • Visual Basic .NET 中的 UInt32 数据类型是什么?

    是什么UInt32VB NET 中的数据类型 有人可以告诉我它的位长度和之间的区别吗UInt32 and Int32 它是整数还是浮点数 它是一个无符号 32 位整数 U 表示无符号 Int 表示整数 32 换 32 或者你可以看看文档 h
  • 将 SageMaker 管道模式与 tfrecords 的 s3 目录结合使用

    我打电话给sagemaker tensorflow TensorFlow fit 当我使用时无限期挂起 没有错误消息Pipe代替File as the input mode 我相应地替换了TensorFlowDataset with Pip
  • Log4j2 系统属性写入文件

    我使用以下 log4j2 配置