您好,我无法使用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接收器,但没有成功。
有什么想法吗?
答案 0 :(得分:0)
问题是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文件管理器中看到它。