【问题标题】:How to to load environment variable on System level and not on User level in Log4Net如何在 Log4Net 中加载系统级别而不是用户级别的环境变量
【发布时间】:2018-01-01 22:54:30
【问题描述】:

我已经为此苦苦挣扎了几个小时,但无济于事。

我需要使用名为 TMPTEMP 的环境变量,其中包含我要登录的 Windows Temp 文件夹。通常是C:\Windows\Temp(当然这个值可能会从一个系统更改为另一个系统,这就是我需要变量值的原因)。

问题是每个键都有两个值:

我使用以下 XML 来指示 Log4Net(在 C# 下)加载临时文件夹(粘贴相关部分):

  <appender name="SomeFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="${TMP}\Logs\SomeLogFileName.log" />
  <appendToFile value="true" />

当我运行我的程序时,它会将日志写入用户临时文件夹: C:\Users\myuser\AppData\Local\Temp\Logs

问题是如何强制 Log4Net 从系统级别而不是用户级别获取 TMP/TEMP 的环境变量?

【问题讨论】:

  • 你不能。该对话框显示变量,就好像有一个单独的层次结构供程序访问一样——没有。获取系统变量,然后添加/更新用户变量,然后 that 作为任何应用程序的整个环境块传递。注册表单独存储这些变量,但应用程序不会单独访问它们。这不是 log4net 特有的。您是否有任何理由不简单地指定您自己的在用户级别覆盖的全局变量?默认情况下,普通用户甚至无法访问C:\Windows\Temp
  • 如果您绝对需要在系统级别为此环境变量定义的值,您需要从注册表 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment) 中提取它并在运行时配置附加程序。但是与简单地将路径放在.config 中相比,我认为这没有什么太大的优势。如果集成商已经更改了临时文件的默认位置,那么更改应用程序的配置并不是什么大负担。
  • 感谢@JeroenMostert。我使用 WINDIR 变量作为解决方法。调用注册表似乎很麻烦。

标签: c# windows environment-variables log4net


【解决方案1】:

如果您的应用程序由特定用户运行,您通常只想写入特定于用户的目录。 C:\Windows\TEMP 是您 PC 的所有用户共享的目录。如果你真的想写,通常你会想以系统用户的身份运行你的应用程序。

(这只是典型的场景;可能存在您希望特定用户写入系统范围目录的个别情况。)

现在,如果您以 SYSTEM 身份运行,您可以将 TMP/TEMP 的系统级定义添加到您的环境中。

【讨论】:

  • 我会检查一下...也许这确实可以自行解决。谢谢!
【解决方案2】:

如果@JeroenMostert 确实是正确的,而且这是不可能的(不转向注册表),我使用WINDIR 环境变量(其值为C:\Windows)作为我将在接下来展示的解决方法。

不过,如果有人提出更好的答案,我会很高兴。

  <appender name="SomeFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="${WINDIR}\temp\Logs\SomeLogFileName.log" />
  <appendToFile value="true" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2012-10-24
    • 2022-11-11
    • 2018-01-15
    • 2017-07-31
    相关资源
    最近更新 更多