【问题标题】:How to use IMvxTrace in MvvmCross如何在 MvvmCross 中使用 IMvxTrace
【发布时间】:2018-09-17 19:32:48
【问题描述】:

最近我开始学习 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 文件中使用它。 能否提供一些sn-p的使用方法

Trace(MvxTraceLevel level, string tag, string message)

在 .Core 或 .Droid 项目中任意选择的 .cs 文件中?

【问题讨论】:

    标签: c# xamarin logging mvvmcross


    【解决方案1】:

    你必须使用依赖注入。完整文档see docs。简而言之,您在视图模型/服务构造函数中添加一个IMvxLog 参数:

    public MyViewModel( IMvxLog logger )
    {
       this._logger = logger;
    }
    

    然后只需在_logger 上调用适当的方法:

    _log.Trace("Some message");
    

    如果你想在一个无法设置依赖注入的类中使用IMvxLog,你可以使用Mvx来解决它:

    var logger = Mvx.Resolve<IMvxLog>();
    

    【讨论】:

    • 我在 .Core 和 .Droid 项目中使用 Mvx.Resolve,但没有看到 IMvxLog。项目中使用的是 MvvmCross v.4.0
    猜你喜欢
    • 2021-03-15
    • 2013-03-15
    • 2020-04-17
    • 2020-03-04
    • 2023-03-21
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多