使用Xamarin.Forms和Serilog将日志写入文件

时间:2018-09-20 09:11:07

标签: android xamarin logging xamarin.forms serilog

您好,我无法使用Xamarin.Forms(.NET Core共享项目)和Serilog在Android设备上将日志写入文件。

到目前为止,我已经在Shared项目中安装了Serilog。将Serilog,Serilog.Sinks.File和Serilog.Sinks.Xamarin安装到我的Android项目中,并在MainActivity中初始化记录器:

Log.Logger = new LoggerConfiguration()
        .WriteTo.File(Path.Combine(Environment.ExternalStorageDirectory.AbsolutePath,"XamarinLib-{Date}.txt"),
                        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}",
                        fileSizeLimitBytes: 100000000,
                        rollingInterval: RollingInterval.Day,
                        rollOnFileSizeLimit: true,
                        shared: false,
                        retainedFileCountLimit: 31,
                        encoding: Encoding.UTF8)
                    .WriteTo.AndroidLog()
                    .CreateLogger();

然后,我从共享项目中调用记录器,例如:

Log.Information("Test writing to log file");

我可以看到在Visual Studio调试输出中正在执行log命令,但是根本没有创建该文件。 我已经在模拟器和实际设备上尝试了多个位置(没有root访问权限)。

我还尝试过以类似方式使用RollingFile接收器,但没有成功。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如Ruben Bartelink所指出的,

问题是Android无法简单地写入外部存储(即/ storage / emulated / 0 ...等)。 我能够在Android和iOS的Xamarin.Forms项目中登录文件。

_Tmp = System.IO.Path.GetTempPath();            
_Path = System.IO.Path.Combine(_Tmp, "Serilog.txt");

Log.Logger = new LoggerConfiguration()
  .MinimumLevel.Debug()
  .WriteTo.File(_Path, rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
  .CreateLogger();

Log.Information("Started new serilogger {SERILOG} on file {FILE}", this, _Path);

Log.CloseAndFlush();

//test
foreach (string log in System.IO.Directory.GetFiles(_Tmp, "*.txt"))
{
    string test = System.IO.File.ReadAllText(log);
    System.Diagnostics.Debug.WriteLine($"Test[{log}] -> {test}");
}

打印在调试控制台上的

    [0:] Test[/data/user/0/com.******/cache/Serilog20190819.txt] -> 2019-08-19 16:00:36.997 +02:00 [INF] Started new serilogger ******.Functions.Serilogger on file /data/user/0/com.******/cache/Serilog.txt

答案 1 :(得分:0)

首先,您必须在AndroidManifest.xml文件中允许权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

下一步,用户必须在运行时批准该操作,在该运行时您必须在后面的代码中对此进行编码。 注意请记住在您的NUGET包上添加Plugin.Permissions

       InitializeComponent();

        Task.Run(async () =>
        {
            try
            {
                var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
                if (status != PermissionStatus.Granted)
                {
                        var accepted = await DisplayAlert("Storage Permission Required",
                            "Please enable your storage permission, it will be used to store logs and crashes",
                            "ACCEPT",
                            "CANCEL");
                        if(accepted)
                        {
                            var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage);
                            status = results[Permission.Storage];
                        }
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("Exception ex", "Exception ex", "OK");
            }
        });

OR

让他们更改settings -> app -> permissions.

中的权限

最后, 更改将链接到storage/emulated/0/[your added directory]的文件名。

关闭应用程序后,您可以在Android文件管理器中看到它。