2017-07-26 22 views
0

我一直在这里挣扎了几个小时,但没有效果。如何在系统级别加载环境变量,而不是Log4Net中的用户级别

我需要使用一个名为TMPTEMP的环境变量,它按住Windows Temp文件夹到我要记录。通常这是C:\Windows\Temp(当然这个值可能会从一个系统改变到另一个系统,这就是为什么我需要变量值)。

的问题是存在用于每个这些键的两个值:

enter image description here

我使用下面的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?

+0

你不能。该对话框呈现变量,就好像程序访问有单独的层次结构一样 - 没有。获取系统变量,然后添加/更新用户变量,然后将* that *作为任何应用程序的整个环境块传递。注册表单独存储这些变量,但应用程序不会单独访问它们。这不是特定于log4net的。是否有任何理由不仅仅指定你自己的全局变量,而是在用户级别*不重写?普通用户默认无法访问'C:\ Windows \ Temp'。 –

+0

如果你完全肯定需要在系统级别为这个环境变量定义的值,你需要从注册表中取出它('HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment')并配置appender在运行。但相比于简单地将路径放在'.config'中,我没有看到任何优势。如果集成商不得不更改应用程序的配置,并且已经更改了临时文件的默认位置,那么这对集成商来说并不是很大的负担。 –

+0

谢谢@JeroenMostert。我使用WINDIR变量作为解决方法。调用注册表似乎很难。 – ilans

回答

1

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

(这仅仅是一个典型的场景;理所当然地认为,有可能是个别情况下,您希望某个特定用户写入到系统级目录)

现在,如果你运行的系统,你会拿起将TMP/TEMP的系统级定义添加到您的环境中。

+0

我会检查一下...也许这确实是自己解决的。谢谢 ! – ilans

0

如果确实@JeroenMostert是正确的,这是不可能的(没有求助于注册表),我用了WINDIR环境变量(值C:\ WINDOWS)作为一个替代,因为我会告诉下一个。

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

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