代码之家  ›  专栏  ›  技术社区  ›  ivke

使用Xamarin将日志写入文件。表格和Serilog

  •  0
  • ivke  · 技术社区  · 7 年前

    您好,我在使用Xamarin将日志写入Android设备上的文件时遇到问题。表单(.NET核心共享项目)和Serilog。

    到目前为止,我已经在共享项目中安装了Serilog。安装了Serilog,Serilog。下沉。文件和日志。下沉。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");
    

    我可以在VisualStudio调试输出中看到正在执行log命令,但该文件只是没有创建。 我在emulator和实际设备上尝试了多个位置(无根访问)。

    我也尝试过以类似的方式使用RollingFile sink,但没有成功。

    0 回复  |  直到 7 年前
        1
  •  3
  •   Paula Kristin    6 年前

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

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

    注意:记得添加插件。对您的NUGET包的权限 :

           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");
                }
            });
    

    让他们更改中的权限 settings -> app -> permissions.

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

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

        2
  •  1
  •   StefanoV    6 年前

    正如鲁本·巴特林(Ruben Bartelink)所指出的,问题在于Android不能简单地写入外部存储(即/storage/simulated/0…等等)。 我可以登录到Xamarin上的一个文件。Android和iOS中的表单项目。

    _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