2009-02-23 11 views
20

Stavo cercando di aggiungere la data al mio nome del file di registro e sono riuscito a farlo funzionare seguendo i pochi suggerimenti che ho trovato in StackOverflow. Tutto funziona bene ma per qualche motivo, il primo file ha sempre la data aggiunta due volte.Perché la data è stata aggiunta due volte sui nomi dei file quando si utilizza Log4Net?

Ad esempio, invece di log.2009-02-23.log, ottengo log.2009-02-23.log.2009-02-23.log.

L'ho trovato così strano e fyi, questo è un codice molto semplice. Non è come se fossi in esecuzione in un ambiente multi-thread.

mio log4net config:

<log4net> 
<appender name="MyLog" type="log4net.Appender.RollingFileAppender"> 
    <file value="../../Logs/Mylog"/> 
    <staticLogFileName value="false" /> 
    <appendToFile value="true"/> 
    <rollingStyle value="Date"/> 
    <datePattern value=".yyyy-MM-dd.lo\g" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/> 
    </layout> 
</appender> 
<root> 
    <level value="INFO"/> 
    <appender-ref ref="MyLog"/> 
</root> 
</log4net> 

Tutte le idee perché? .

Edit: Voglio aggiungere le informazioni circa l'ambiente sto testando questo
- asp.net
- .NET Framework 2.0
- Windows Server 2003 a 64 bit Service Pack 2
- log4net 1.2.10

risposta

5

E 'un problema di permessi. Almeno questo è quello che mi sta succedendo.

Sono nuovo nell'utilizzo di Log4Net, quindi non sapevo che avesse una registrazione interna, ma l'ho trovato così ho provato a girare internal logging su. Non ero molto sicuro di cosa stia dicendo, ma ecco cosa mi sembra che stia facendo: 1. Aggiungi la data al nome del file. 2. Provare ad accedere al file per scrivervi (non riuscito). 3. Aggiungere la data al nome file di nuovo. 4. Accedi con successo al file (che ora ha il nome del file strano)

Prima che io lo sapessi, stavo cercando google-go per risolvere questo problema con parole chiave come quello che ho come titolo su questa domanda StackOverflow. Non c'erano molte informazioni là fuori. Ho trovato forse un ragazzo che ha detto che succede ad alcune persone, ma non ha mai veramente spiegato perché né la soluzione. Con queste nuove informazioni (+ il messaggio di errore interno di Log4Net), stavo guardando diversi thread dai motori di ricerca. Con quello ho trovato suggerimenti che potrebbe essere un problema di autorizzazione.

Sembra che l'applicazione di scrittura non disponga di autorizzazioni sufficienti per la cartella dei registri. L'identità predefinita dell'applicazione è in genere NETWORK_SERVICE. Dopo aver dato più permessi (ho dato il pieno controllo ma non so quale sia il minimo per farlo funzionare) nella cartella, funziona bene.

Se qualcuno può spiegare questo meglio di me, non esitate a modificare.

+0

Controllo completo consente all'utente di modificare il set di autorizzazioni su un file, assumere la proprietà del file ed eseguire azioni consentite da tutte le altre autorizzazioni di file . – graffic

0

provare <datePattern value=".yyyy-MM-dd.lo\g" /> Non capisco a cosa serve \ g.

+1

Il tag datePattern accetta la stringa formattata con data e ora come valore. "g" è un modello di formato data e ora valido (google DateTimeFormatInfo), quindi devo "scapparlo" in modo che non venga interpretato. –

+0

puoi dirmi di più sulla versione di log4net che stai usando e sul resto del tuo ambiente (os, .net versione ecc.). Non ho mai avuto problemi con il dover scappare dal registro. – olle

+0

- Service Pack 2 per Windows Server 2003 x64 - .NET Framework 2.0 - log4net 1.2.10 Informazioni su come evitare la g, guarda il mio commento su devinb. –

1

Come ha sottolineato Olle. il tuo problema è relativo al '\ g', che il tuo log4net sta interpretando come un altro dateformat. Provare a eliminare il ".yyyy-MM-dd.lo \ g" e la sua sostituzione con "AAAA-MM-dd"

Il "log" non appartiene alla dateformat

+0

Se non inserisco ".log", otterrò nomi di file come questo: "log.2009-02-23" senza estensione o si può dire che la data è l'estensione. Voglio accedere alla cartella dei registri dal browser, quindi ho dovuto aggiungere ".log" all'elenco dei tipi MIME della cartella in IIS. –

+0

Lo hai provato senza ".lo \ g" e solo ".log" per vedere se "\" è il problema? – DevinB

+0

inoltre, il "." all'inizio. – DevinB

1

Io uso il seguente:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/> 

Con questo ho i nomi di file come: 2009.02.23.log

+0

Non hai davvero bisogno per sfuggire a l e a o ma non penso che risolva il mio problema: –

10

Ciò accade se si verifica un problema durante l'accesso al file di registro durante l'inizializzazione del sistema di registro. Può accadere se si inizializza il sistema di registrazione due volte, se si esegue il programma mentre un'altra copia è in esecuzione e si scrive nel file di registro o se si modifica il file di registro in un editor di testo. Fondamentalmente tutto ciò che causa un blocco di scrittura sul file di log quando viene eseguito init di log4net.

Controlla il tuo codice per le chiamate duplicate a log4net init - forse stai inizializzando in un costruttore invece che nel costruttore statico di un singleton o in init globale, ad esempio.

Ciò può verificarsi anche se si esegue una configurazione di "giardino Web" e non si include il PID nel nome file, poiché ogni processo di server Web diverso tenta di scrivere sullo stesso file. Se si utilizza web garden e si scrive su file, aggiungere il pid al pattern filename in modo che ogni processo del server abbia il proprio file.

1

Mi imbatto nello stesso problema. Per me, era una combinazione di usare RollingFileAppender per i miei registri di test e di eseguire i miei test NUnit con ReSharper.

Si scopre che ReSharper utilizza due processi per eseguire i test:

2 TaskRunners

che crea una condizione di competizione sul file di log.

Ora, se cambiamo il nome del file di registro per includere l'ID del processo:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Composite" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="false"/> 
    <datePattern value="_yyyy-MM-dd'.log'"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" /> 
    </layout> 
</appender> 

il problema è risolto. Ogni file ottiene il proprio, unico nome:

MyLog.pid.5440_2010-10-13.log
MyLog.pid.1496_2010-10-13.log

Nota l'uso di PatternString per "tipo".

Spero che questo aiuti.

Problemi correlati