Nasıl dosya konumunu programlı olarak değiştirebilir miyim?
Tamamen yeni Log4net ediyorum.
Bir şeyler başarmak dosyası ve basit bir yapılandırma günlüğü ekleyerek başardım.
Değeri "C:\temp\log.txt"
kodlanmış var ama bu yeterli değil.
Özel klasörlere gitmek zorunda kaydeder
path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
ve bu yol, Windows Server 2008 veya Windows XP veya Vista vb kullanarak olup olmadığını bağlı olarak değişir...
Nasıl log4net Program aracılığıyla dosya konumunu değiştirebilir miyim?
Bu yaptığım şey
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="C:\temp\log.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
</layout>
</appender>
</log4net>
class Program
{
protected static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
log.Warn("Log something");
path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
// How can I change where I log stuff?
}
}
Sadece değiştirebilirim nasıl anlamaya istiyorum nerede için malzeme giriş yapmak.
Herhangi bir öneriniz var mı? Çok teşekkürler
CEVAP
log4net sizin için halledebilir. String türünde herhangi bir appender özelliği, bu durumda, log4net.Util.PatternString seçeneği işleyicisi kullanarak biçimlendirilebilir. PatternString bile şu zarif config sağlayan SpecialFolder numaralama destekler:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file type="log4net.Util.PatternString"
value="%envFolderPath{CommonApplicationData}\\test.txt" />
...
</appender>
İşte puding delillerinden bir birim test:
[Test]
public void Load()
{
XmlConfigurator.Configure();
var fileAppender = LogManager.GetRepository()
.GetAppenders().First(appender => appender is RollingFileAppender);
var expectedFile =
Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData),
"test.txt");
Assert.That(fileAppender,
Is.Not.Null & Has.Property("File").EqualTo(expectedFile));
}
Aşağıdaki test log4net aslında diske yazar doğrular temelde bu "bütünleşme" test, birim test, ama şimdilik bu kalsın): . bir kılan (
[Test]
public void Log4net_WritesToDisk()
{
var expectedFile =
Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData),
"test.txt");
if (File.Exists(expectedFile))
File.Delete(expectedFile);
XmlConfigurator.Configure();
var log = LogManager.GetLogger(typeof (ConfigTest));
log.Info("Message from test");
LogManager.Shutdown();
Assert.That(File.ReadAllText(expectedFile),
Text.Contains("Message from test"));
}
NB: ben güçlü kompakt özellik sözdizimi yukarıda örnek gösterilen kullanmanızı öneririz. Tüm bu "<property name=" config çok daha okunabilir olduğunu. kaldırma
Nasıl veya EXE MSI yükleyici yerine sı...
Nasıl iOS 7 varsayılan mavi renk progr...
Nasıl programlı olarak değiştir dosya ...
Nasıl Eylem Bar eylemler dinamik olara...
Nasıl kalıcı olarak Vim şu anki dosya ...