C# 如何在Log4Net中在系统级而不是用户级加载环境变量

C# 如何在Log4Net中在系统级而不是用户级加载环境变量,c#,windows,environment-variables,log4net,C#,Windows,Environment Variables,Log4net,我在这件事上挣扎了几个小时,但毫无结果 我需要使用一个名为TMP或TEMP的环境变量,它保存我要登录的Windows TEMP文件夹。通常是C:\Windows\Temp(当然,这个值可能会随着系统的不同而变化,这就是我需要变量值的原因) 问题在于,每个键都有两个值: 我使用以下XML指示Log4Net(在C#下)加载临时文件夹(粘贴相关部分): 当我运行程序时,它会将日志写入users temp文件夹: C:\Users\myuser\AppData\Local\Temp\Logs 问题

我在这件事上挣扎了几个小时,但毫无结果

我需要使用一个名为
TMP
TEMP
的环境变量,它保存我要登录的Windows TEMP文件夹。通常是
C:\Windows\Temp
(当然,这个值可能会随着系统的不同而变化,这就是我需要变量值的原因)

问题在于,每个键都有两个值:

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


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


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

如果确实
@jeroenmoster
是正确的,并且不可能(不转到注册表),我使用了
WINDIR
环境变量(其值为C:\Windows)作为一项工作,我将在下面展示

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

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

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

(这只是一个典型的场景;假设在某些情况下,您希望特定用户写入系统范围的目录。)


现在,如果您作为系统运行,您将在您的环境中获取TMP/TEMP的系统级定义。

您不能。该对话框显示变量,就好像有一个单独的层次结构供程序访问一样——没有。获取系统变量,然后添加/更新用户变量,然后作为任何应用程序的整个环境块传递。注册表单独存储这些变量,但应用程序不会单独访问它们。这不是log4net特有的。是否有任何理由不简单地指定自己的全局变量,而该变量在用户级别不被覆盖?默认情况下,常规用户甚至无法访问
C:\Windows\Temp
。如果您确实需要在系统级别为此环境变量定义的值,则需要从注册表中提取该值(
HKEY\U LOCAL\U MACHINE\system\CurrentControlSet\Control\Session Manager\environment
)并在运行时配置appender。但与简单地将路径放在
.config
中相比,我看不出有什么优势。如果集成商已经更改了临时文件的默认位置,那么必须更改应用程序的配置对集成商来说并不是很大的负担。谢谢@jeroenmoster。我使用WINDIR变量作为解决方法。给登记处打电话似乎有点麻烦我会查一查的。。。也许这真的可以自己解决。谢谢
  <appender name="SomeFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="${WINDIR}\temp\Logs\SomeLogFileName.log" />
  <appendToFile value="true" />