Запись логов в файл с использованием Xamarin.Forms и Serilog - PullRequest
0 голосов
/ 20 сентября 2018

Здравствуйте. У меня проблемы с записью журналов в файл на устройстве Android с использованием Xamarin.Forms (общий проект .NET Core) и Serilog.

Пока что я установил 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");

Я вижу, как команда log выполняется в отладочных выходах Visual Studio, но файл просто не создается.Я пробовал несколько местоположений как на эмуляторе, так и на реальном устройстве (без root-доступа).

Я также пытался использовать прием RollingFile аналогичным образом, но безуспешно.

Есть идеи?

1 Ответ

0 голосов
/ 19 августа 2019

как указал Рубен Бартелинк, проблема в том, что Android не может просто записывать данные во внешнее хранилище (то есть / storage / emulated / 0 ... и т.д ..).Мне удалось войти в файл в проекте Xamarin.Forms как на 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
...