如何在MvvmCross中使用IMvxTrace
How to use IMvxTrace in MvvmCross
最近开始研究Xamarin,今天打开了MvvmCross上写的大项目,里面要加新功能。这很难,因为我通常使用 Java 和 Android Studio,但现在我必须深入研究 C# 和 Visual Studio。
首先我想了解这个项目的流程,为此我想在不同的 .cs 中插入日志 类 并在浏览应用程序时查看它们。
在Setup.cs中:
protected override IMvxTrace CreateDebugTrace()
{
return new NLogTrace();
}
NLogTrace.cs:
public class NLogTrace : IMvxTrace
{
private readonly ILogger _logger;
public NLogTrace()
{
InitializeNLog();
_logger = LogManager.GetLogger("MvvmCross");
}
public static string LogFileName => Path.Combine(GetCacheFolder(), "logFile.txt");
private static void InitializeNLog()
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets and add them to the configuration
var consoleTarget = new ConsoleTarget();
config.AddTarget("console", consoleTarget);
var logFolderPath = GetCacheFolder();
var fileTarget = new FileTarget
{
FileName = Path.Combine(logFolderPath, "logFile.txt"),
ArchiveFileName = Path.Combine(logFolderPath, "log.{#}.txt"),
ArchiveEvery = FileArchivePeriod.Day,
ArchiveNumbering = ArchiveNumberingMode.Date,
MaxArchiveFiles = 7
};
config.AddTarget("file", fileTarget);
// Step 3. Set target properties
consoleTarget.Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"; //
fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}";
// Step 4. Define rules
var rule1 = new LoggingRule("*", LogLevel.Trace, consoleTarget);
config.LoggingRules.Add(rule1);
#if DEBUG
var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule2);
#else
var rule2 = new LoggingRule("*", LogLevel.Info, fileTarget);
config.LoggingRules.Add(rule2);
#endif
LogManager.Configuration = config;
}
private static string GetCacheFolder()
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var relativeCacheFolderPath = Path.Combine(documents, "Storage", "Logs");
var directory = new DirectoryInfo(relativeCacheFolderPath);
var resolvedCacheFolderPath = directory.FullName;
return resolvedCacheFolderPath;
}
public void Trace(MvxTraceLevel level, string tag, string message)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message);
break;
case MvxTraceLevel.Warning:
_logger.Warn(message);
break;
case MvxTraceLevel.Error:
_logger.Error(message);
break;
}
}
public void Trace(MvxTraceLevel level, string tag, Func<string> message)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message());
break;
case MvxTraceLevel.Warning:
_logger.Warn(message());
break;
case MvxTraceLevel.Error:
_logger.Error(message());
break;
}
}
public void Trace(MvxTraceLevel level, string tag, string message, params object[] args)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message, args);
break;
case MvxTraceLevel.Warning:
_logger.Warn(message, args);
break;
case MvxTraceLevel.Error:
_logger.Error(message, args);
break;
}
}
}
所以,我看到了一些记录器,但我不知道如何在某些 .cs 文件中使用它。
你能提供一些如何使用的片段
Trace(MvxTraceLevel level, string tag, string message)
在 .Core 或 .Droid 项目中任意选择的 .cs 文件中?
你必须使用依赖注入。如需完整文档 see docs。简而言之,您在视图 model/service 构造函数中添加一个 IMvxLog
参数:
public MyViewModel( IMvxLog logger )
{
this._logger = logger;
}
然后在 _logger
上调用适当的方法:
_log.Trace("Some message");
如果你想在无法设置依赖注入的class中使用IMvxLog
,你可以使用Mvx
解决它:
var logger = Mvx.Resolve<IMvxLog>();
最近开始研究Xamarin,今天打开了MvvmCross上写的大项目,里面要加新功能。这很难,因为我通常使用 Java 和 Android Studio,但现在我必须深入研究 C# 和 Visual Studio。
首先我想了解这个项目的流程,为此我想在不同的 .cs 中插入日志 类 并在浏览应用程序时查看它们。
在Setup.cs中:
protected override IMvxTrace CreateDebugTrace()
{
return new NLogTrace();
}
NLogTrace.cs:
public class NLogTrace : IMvxTrace
{
private readonly ILogger _logger;
public NLogTrace()
{
InitializeNLog();
_logger = LogManager.GetLogger("MvvmCross");
}
public static string LogFileName => Path.Combine(GetCacheFolder(), "logFile.txt");
private static void InitializeNLog()
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets and add them to the configuration
var consoleTarget = new ConsoleTarget();
config.AddTarget("console", consoleTarget);
var logFolderPath = GetCacheFolder();
var fileTarget = new FileTarget
{
FileName = Path.Combine(logFolderPath, "logFile.txt"),
ArchiveFileName = Path.Combine(logFolderPath, "log.{#}.txt"),
ArchiveEvery = FileArchivePeriod.Day,
ArchiveNumbering = ArchiveNumberingMode.Date,
MaxArchiveFiles = 7
};
config.AddTarget("file", fileTarget);
// Step 3. Set target properties
consoleTarget.Layout = @"${longdate}|${level:uppercase=true}|${logger}|${message}"; //
fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}";
// Step 4. Define rules
var rule1 = new LoggingRule("*", LogLevel.Trace, consoleTarget);
config.LoggingRules.Add(rule1);
#if DEBUG
var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget);
config.LoggingRules.Add(rule2);
#else
var rule2 = new LoggingRule("*", LogLevel.Info, fileTarget);
config.LoggingRules.Add(rule2);
#endif
LogManager.Configuration = config;
}
private static string GetCacheFolder()
{
var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var relativeCacheFolderPath = Path.Combine(documents, "Storage", "Logs");
var directory = new DirectoryInfo(relativeCacheFolderPath);
var resolvedCacheFolderPath = directory.FullName;
return resolvedCacheFolderPath;
}
public void Trace(MvxTraceLevel level, string tag, string message)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message);
break;
case MvxTraceLevel.Warning:
_logger.Warn(message);
break;
case MvxTraceLevel.Error:
_logger.Error(message);
break;
}
}
public void Trace(MvxTraceLevel level, string tag, Func<string> message)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message());
break;
case MvxTraceLevel.Warning:
_logger.Warn(message());
break;
case MvxTraceLevel.Error:
_logger.Error(message());
break;
}
}
public void Trace(MvxTraceLevel level, string tag, string message, params object[] args)
{
switch (level)
{
case MvxTraceLevel.Diagnostic:
_logger.Debug(message, args);
break;
case MvxTraceLevel.Warning:
_logger.Warn(message, args);
break;
case MvxTraceLevel.Error:
_logger.Error(message, args);
break;
}
}
}
所以,我看到了一些记录器,但我不知道如何在某些 .cs 文件中使用它。 你能提供一些如何使用的片段
Trace(MvxTraceLevel level, string tag, string message)
在 .Core 或 .Droid 项目中任意选择的 .cs 文件中?
你必须使用依赖注入。如需完整文档 see docs。简而言之,您在视图 model/service 构造函数中添加一个 IMvxLog
参数:
public MyViewModel( IMvxLog logger )
{
this._logger = logger;
}
然后在 _logger
上调用适当的方法:
_log.Trace("Some message");
如果你想在无法设置依赖注入的class中使用IMvxLog
,你可以使用Mvx
解决它:
var logger = Mvx.Resolve<IMvxLog>();