2017-07-26 4 views
0

J'ai eu des difficultés pendant quelques heures sans succès.Comment charger la variable d'environnement au niveau du système et pas au niveau utilisateur dans Log4Net

-je utiliser une variable d'environnement appelée TMP ou TEMP, qui détiennent le dossier Temp Windows auquel je veux vous connecter. Habituellement, c'est C:\Windows\Temp (bien sûr, cette valeur peut changer d'un système à l'autre, c'est pourquoi j'ai besoin de la valeur de la variable).

Le problème est qu'il ya deux valeurs pour chacune de ces touches: pour charger le dossier temporaire (collé la partie correspondante)

enter image description here

J'utilise le code XML suivant pour instruire Log4Net (en C#):

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

Quand je courais mon programme, il écrit le journal dans le dossier temp utilisateurs: C:\Users\myuser\AppData\Local\Temp\Logs

La question est de savoir comment forcer Log4Net à prendre la variable d'environnement de TMP/TEMP à partir du niveau du système et pas au niveau de l'utilisateur?

+0

Vous ne pouvez pas. Ce dialogue présente les variables comme s'il y avait une hiérarchie séparée pour les programmes à accéder - il n'y en a pas. Les variables système sont prises, puis les variables utilisateur sont ajoutées/mises à jour, puis * que * est passé en tant que bloc d'environnement entier pour toute application. Le registre stocke ces variables séparément, mais les applications n'y accèdent pas séparément. Ce n'est pas spécifique à log4net. Y a-t-il une raison pour laquelle vous ne spécifiez pas simplement votre propre variable globale qui n'est * pas * surchargée au niveau de l'utilisateur? Les utilisateurs réguliers ne peuvent même pas accéder à 'C: \ Windows \ Temp' par défaut. –

+0

Si vous avez absolument besoin de la valeur définie au niveau système pour cette variable d'environnement, vous devez l'extraire du registre ('HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment') et configurer l'appender à runtime. Mais je ne vois pas de grand avantage par rapport à cela en mettant simplement le chemin dans '.config'. Ce n'est pas un fardeau pour les intégrateurs de devoir modifier la configuration de votre application, s'ils sont déjà allés jusqu'à changer l'emplacement par défaut des fichiers temporaires. –

+0

Merci @JeroenMostert. J'ai utilisé la variable WINDIR comme solution de contournement. Appeler le registre semblait hacky. – ilans

Répondre

1

Si votre demande est en cours d'exécution par un utilisateur spécifique, vous voudrez typiquement écrire uniquement à des répertoires spécifiques à l'utilisateur. C: \ Windows \ TEMP est un répertoire partagé entre tous les utilisateurs de votre PC. Si vous voulez vraiment écrire dessus, vous voudrez généralement exécuter votre application en tant qu'utilisateur système.

(Ceci est juste le scénario typique,. Accordé qu'il peut y avoir des circonstances particulières où vous voulez un utilisateur spécifique à écrire dans un répertoire système)

Maintenant, si vous exécutez en tant que SYSTEM, vous ramasser les définitions au niveau système de TMP/TEMP dans votre environnement.

+0

Je vais vérifier ça ...peut-être que c'est effectivement résolu par lui-même. Merci ! – ilans

0

En effet, si @JeroenMostert est bon, et il est impossible (sans se tourner vers le registre), j'utilise la variable d'environnement WINDIR (dont la valeur est C: \ Windows) en tant que travail autour que je vais vous montrer prochain.

Pourtant, si quelqu'un trouve une meilleure réponse, je serai heureux.

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