Add a basic log issue reporter

This commit is contained in:
lukeIam committed 2018-01-18 13:14:27 +01:00
1 parent 47bd3286d5
commit d9a98fcd14
10 files changed
+2107 -13

No files matched your search

+2 -1
View File
@@ -28,6 +28,7 @@ using Vocaluxe.Base;
using Vocaluxe.Base.Fonts;
using Vocaluxe.Base.Server;
using Vocaluxe.Base.ThemeSystem;
using Vocaluxe.Reporting;
using VocaluxeLib.Log;
[assembly: InternalsVisibleTo("VocaluxeTests")]
@@ -97,7 +98,7 @@ namespace Vocaluxe
Directory.CreateDirectory(CSettings.DataFolder);
// Init Log
CLog.Init(CSettings.FolderNameLogs, CSettings.FileNameMainLog, CSettings.FileNameSongLog, CSettings.FileNameCrashMarker, CSettings.GetFullVersionText());
CLog.Init(CSettings.FolderNameLogs, CSettings.FileNameMainLog, CSettings.FileNameSongLog, CSettings.FileNameCrashMarker, CSettings.GetFullVersionText(), CReporter.ShowReporterFunc);
if (!CProgrammHelper.CheckRequirements())
return;
+186
View File
@@ -0,0 +1,186 @@
namespace Vocaluxe.Reporting
{
partial class CReporter
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CReporter));
this.Title = new System.Windows.Forms.Label();
this.Message = new System.Windows.Forms.TextBox();
this.Log = new System.Windows.Forms.TextBox();
this.GistOnly = new System.Windows.Forms.RadioButton();
this.GistAndIssue = new System.Windows.Forms.RadioButton();
this.NoUpload = new System.Windows.Forms.RadioButton();
this.Submit = new System.Windows.Forms.Button();
this.Url = new System.Windows.Forms.TextBox();
this.SubmitedMessage = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// Title
//
this.Title.AutoSize = true;
this.Title.Enabled = false;
this.Title.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Title.Location = new System.Drawing.Point(9, 8);
this.Title.Name = "Title";
this.Title.Size = new System.Drawing.Size(110, 20);
this.Title.TabIndex = 0;
this.Title.Text = "We are sorry";
//
// Message
//
this.Message.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.Message.Enabled = false;
this.Message.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Message.Location = new System.Drawing.Point(13, 31);
this.Message.Multiline = true;
this.Message.Name = "Message";
this.Message.ReadOnly = true;
this.Message.Size = new System.Drawing.Size(625, 63);
this.Message.TabIndex = 0;
this.Message.TabStop = false;
this.Message.Text = "that Vocaluxe run into an error and crashed.\r\nTo help us fix the problem please s" +
"end us a report.\r\nEdit the following log before submitting to remove possibly se" +
"nsitive information.";
//
// Log
//
this.Log.AcceptsReturn = true;
this.Log.AcceptsTab = true;
this.Log.Location = new System.Drawing.Point(13, 100);
this.Log.Multiline = true;
this.Log.Name = "Log";
this.Log.Size = new System.Drawing.Size(625, 189);
this.Log.TabIndex = 1;
//
// GistOnly
//
this.GistOnly.AutoSize = true;
this.GistOnly.Checked = true;
this.GistOnly.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.GistOnly.Location = new System.Drawing.Point(12, 295);
this.GistOnly.Name = "GistOnly";
this.GistOnly.Size = new System.Drawing.Size(385, 24);
this.GistOnly.TabIndex = 2;
this.GistOnly.TabStop = true;
this.GistOnly.Text = "Upload and get a link to your report (publicly visible)";
this.GistOnly.UseVisualStyleBackColor = true;
//
// GistAndIssue
//
this.GistAndIssue.AutoSize = true;
this.GistAndIssue.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.GistAndIssue.Location = new System.Drawing.Point(12, 325);
this.GistAndIssue.Name = "GistAndIssue";
this.GistAndIssue.Size = new System.Drawing.Size(519, 24);
this.GistAndIssue.TabIndex = 3;
this.GistAndIssue.TabStop = true;
this.GistAndIssue.Text = "Upload and open an issue (publicly visible + requires a github account)";
this.GistAndIssue.UseVisualStyleBackColor = true;
//
// NoUpload
//
this.NoUpload.AutoSize = true;
this.NoUpload.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.NoUpload.Location = new System.Drawing.Point(12, 355);
this.NoUpload.Name = "NoUpload";
this.NoUpload.Size = new System.Drawing.Size(493, 24);
this.NoUpload.TabIndex = 4;
this.NoUpload.TabStop = true;
this.NoUpload.Text = "Don\'t upload anything (you can still copy the error message above)";
this.NoUpload.UseVisualStyleBackColor = true;
this.NoUpload.CheckedChanged += new System.EventHandler(this.NoUpload_CheckedChanged);
//
// Submit
//
this.Submit.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Submit.Location = new System.Drawing.Point(537, 306);
this.Submit.Name = "Submit";
this.Submit.Size = new System.Drawing.Size(101, 73);
this.Submit.TabIndex = 5;
this.Submit.Text = "Submit";
this.Submit.UseVisualStyleBackColor = true;
this.Submit.Click += new System.EventHandler(this.Submit_Click);
//
// Url
//
this.Url.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Url.Location = new System.Drawing.Point(12, 327);
this.Url.Name = "Url";
this.Url.ReadOnly = true;
this.Url.Size = new System.Drawing.Size(519, 22);
this.Url.TabIndex = 6;
this.Url.Text = "https://gist.github.com/lukeIam/cc81f7ef3545ef2baf0ca9a28ffe4bd8";
this.Url.Visible = false;
//
// SubmitedMessage
//
this.SubmitedMessage.AutoSize = true;
this.SubmitedMessage.Enabled = false;
this.SubmitedMessage.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.SubmitedMessage.Location = new System.Drawing.Point(9, 299);
this.SubmitedMessage.Name = "SubmitedMessage";
this.SubmitedMessage.Size = new System.Drawing.Size(189, 20);
this.SubmitedMessage.TabIndex = 8;
this.SubmitedMessage.Text = "The link to your report:";
this.SubmitedMessage.Visible = false;
//
// CReporter
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(650, 387);
this.Controls.Add(this.SubmitedMessage);
this.Controls.Add(this.Url);
this.Controls.Add(this.Submit);
this.Controls.Add(this.NoUpload);
this.Controls.Add(this.GistAndIssue);
this.Controls.Add(this.GistOnly);
this.Controls.Add(this.Log);
this.Controls.Add(this.Message);
this.Controls.Add(this.Title);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "CReporter";
this.Text = "Vocaluxe Issue Reporter";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label Title;
private System.Windows.Forms.TextBox Message;
private System.Windows.Forms.TextBox Log;
private System.Windows.Forms.RadioButton GistOnly;
private System.Windows.Forms.RadioButton GistAndIssue;
private System.Windows.Forms.RadioButton NoUpload;
private System.Windows.Forms.Button Submit;
private System.Windows.Forms.TextBox Url;
private System.Windows.Forms.Label SubmitedMessage;
}
}
+258
View File
@@ -0,0 +1,258 @@
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using VocaluxeLib.Log;
namespace Vocaluxe.Reporting
{
public partial class CReporter : Form
{
private string _TitleText = "We are sorry";
private string _MessageCrashText = "that Vocaluxe run into an error and crashed.\r\nTo help us fix the problem please send us a report.\r\nEdit the following log before submitting to remove possibly sensitive information.";
private string _MessageNoCrashText = "that you experienced an error.\r\nTo help us fix the problem please send us a report.\r\nEdit the following log before submitting to remove possibly sensitive information.";
private string _NoUploadText = "Don\'t upload anything (you can still copy the error message above)";
private string _GistAndIssueText = "Upload and open an issue (publicly visible + requires a github account)";
private string _GistOnlyText = "Upload and get a link to your report (publicly visible)";
private string _SubmitStep0Text = "Submit";
private string _SubmitStep1Text = "Uploading";
private string _SubmitStep2CrashText = "Exit";
private string _SubmitStep2NoCrashText = "Continue";
private string _SubmitedMessageText = "The link to your report:";
private string _LogUploadErrorText = "Error uploading the log.";
private string _IssueTemplate = "Describe your issue here.\n\n### Steps to reproduce\nTell us how to reproduce this issue.\n\n### Vocaluxe version and logfile\n{0}\n{1}";
private int _Step = 0;
private readonly bool _Crash;
private readonly string _VocaluxeVersionTag;
private readonly bool _ShowContinue;
private static readonly HttpClient _Client = new HttpClient();
private static readonly Regex _GetGistUrlRegex = new Regex("\"raw_url\": *\"([^\"]+)\"");
public static ShowReporterDelegate ShowReporterFunc
{
get { return _ShowReporter; }
}
private static void _ShowReporter(bool crash, bool showContinue, string vocaluxeVersionTag, string log)
{
using (var reporter = new CReporter(crash, showContinue, vocaluxeVersionTag, log))
{
reporter.ShowDialog();
}
}
/// <summary>
/// Creates a new instance of the log file reporter.
/// </summary>
/// <param name="crash">True if we are submitting a crash, false otherwise (e.g. error).</param>
/// <param name="showContinue">True if the reporter show show a continue message, false if it should show an exit message.</param>
/// <param name="vocaluxeVersionTag">The full version tag of this instance (like it is diplayed in the main menu).</param>
/// <param name="log">The log to submit.</param>
public CReporter(bool crash, bool showContinue, string vocaluxeVersionTag, string log)
{
InitializeComponent();
_Crash = crash;
_ShowContinue = showContinue;
_VocaluxeVersionTag = vocaluxeVersionTag;
_Init(log);
}
/// <summary>
/// Initilaize the gui.
/// </summary>
/// <param name="log">The Log to submit.</param>
private void _Init(string log)
{
_Client.DefaultRequestHeaders.Add("accept", "application/json");
_Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)");
this.Title.Text = _TitleText;
this.Message.Text = _Crash ? _MessageCrashText : _MessageNoCrashText;
this.NoUpload.Text = _NoUploadText;
this.GistAndIssue.Text = _GistAndIssueText;
this.GistOnly.Text = _GistOnlyText;
this.Submit.Text = _SubmitStep0Text;
this.SubmitedMessage.Text = _SubmitedMessageText;
this.Log.Text = log.Replace("\n","\r\n");
this.Log.SelectionStart = 0;
}
private async void Submit_Click(object sender, EventArgs e)
{
switch (_Step)
{
case 0:
if (this.NoUpload.Checked)
{
this.Close();
}
else
{
_Step = 1;
this.Submit.Text = _SubmitStep1Text;
this.Submit.Enabled = false;
this.NoUpload.Visible = false;
this.GistAndIssue.Visible = false;
this.GistOnly.Visible = false;
this.Log.Enabled = false;
string url;
if (this.GistOnly.Checked)
{
await Task.Run(() => _StartGistUpload(this.Log.Text));
}
else if (this.GistAndIssue.Checked)
{
await Task.Run(() => _StartIssueUpload(this.Log.Text));
}
else
{
_Step = 0;
this.Submit.Text = _SubmitStep0Text;
this.Submit.Enabled = true;
this.NoUpload.Visible = true;
this.GistAndIssue.Visible = true;
this.GistOnly.Visible = true;
this.Log.Enabled = true;
}
}
break;
case 2:
this.Close();
break;
}
}
private void NoUpload_CheckedChanged(object sender, EventArgs e)
{
this.Submit.Text = this.NoUpload.Checked ? (_ShowContinue ? _SubmitStep2CrashText : _SubmitStep2NoCrashText) : _SubmitStep0Text;
}
/// <summary>
/// Updates the gui after the upload finished.
/// </summary>
/// <param name="url">Url to show, if null or empty an error message is shown.</param>
private void _UploadFinished(string url)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => { _UploadFinished(url); }));
}
else
{
_Step = 2;
this.Submit.Text = _ShowContinue ? _SubmitStep2CrashText : _SubmitStep2NoCrashText;
this.Submit.Enabled = true;
this.SubmitedMessage.Visible = true;
this.Url.Text = string.IsNullOrWhiteSpace(url)?_LogUploadErrorText:url;
this.Url.Visible = true;
this.Url.SelectAll();
}
}
/// <summary>
/// Upload a log to gist and updates the gui.
/// </summary>
/// <param name="log">The log to upload.</param>
private async void _StartGistUpload(string log)
{
// Upload log to github gist and show the link
_UploadFinished(await _UploadLogToGist(log));
}
/// <summary>
/// Upload a log to gist, opens an issue template on github and updates the gui.
/// </summary>
/// <param name="log">The log to upload.</param>
private async void _StartIssueUpload(string log)
{
// Upload log to github gist
string gistUrl = await _UploadLogToGist(log);
// Build issue body
string template = string.Format(_IssueTemplate, _VocaluxeVersionTag, gistUrl);
// Build url for github issue template
string issueUrl = $"https://github.com/Vocaluxe/Vocaluxe/issues/new?title=Give%20me%20a%20meaningful%20title&body={ Uri.EscapeDataString(template) }";
// Start the browser with the issue template url
System.Diagnostics.Process.Start(issueUrl);
// Show the link
_UploadFinished(issueUrl);
}
/// <summary>
/// Uploads a log to a new anonymous gist.
/// </summary>
/// <param name="log">The log that should be uploaded.</param>
/// <returns>The link to the uploaded file.</returns>
private async Task<string> _UploadLogToGist(string log)
{
string json = JsonConvert.SerializeObject(new CGistCreateData()
{
Description = $"An { (_Crash ? "crash" : "error") } log submission for { _VocaluxeVersionTag }",
Public = false,
Files = new Dictionary<string, CGistFileData>()
{
{
"Vocaluxe.log",
new CGistFileData()
{
Content = log
}
}
}
});
var content = new StringContent(json, Encoding.UTF8, "application/json");
string responseString = "";
try
{
var response = await _Client.PostAsync("https://api.github.com/gists", content);
responseString = await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException e)
{
CLog.Error(e, "Couldn't upload log", show:true, propertyValues:CLog.Params(json));
}
return _GetGistUrlRegex.Match(responseString)?.Groups[1]?.Value??"";
}
/// <summary>
/// Helper class for gist creation.
/// </summary>
private class CGistCreateData
{
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("public")]
public bool Public { get; set; }
[JsonProperty("files")]
public Dictionary<string, CGistFileData> Files { get; set; }
}
/// <summary>
/// Helper class for gist creation.
/// </summary>
private class CGistFileData
{
[JsonProperty("content")]
public string Content { get; set; }
}
}
}
File diff suppressed because it is too large. Load diff
+16
View File
@@ -159,6 +159,10 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.2.6.0\lib\net46\Serilog.dll</HintPath>
<Private>True</Private>
@@ -186,6 +190,7 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Web" />
@@ -282,6 +287,12 @@
<Compile Include="Lib\Video\Acinerella\CDecoderThread.cs" />
<Compile Include="Lib\Video\Acinerella\CFramebuffer.cs" />
<Compile Include="Lib\Sound\Record\CDelayTest.cs" />
<Compile Include="Reporting\Reporter.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reporting\Reporter.Designer.cs">
<DependentUpon>Reporter.cs</DependentUpon>
</Compile>
<Compile Include="Screens\CPopupScreenServerQR.cs" />
<Compile Include="Screens\CScreenOptionsVideoAdjustments.cs" />
<Compile Include="SongQueue\CSongQueue.cs" />
@@ -512,6 +523,11 @@
<ItemGroup>
<WCFMetadata Include="Service References\" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Reporting\Reporter.resx">
<DependentUpon>Reporter.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">xcopy /E /D /Y "$(ProjectDir)\Website" "$(SolutionDir)\PhoneGap"</PostBuildEvent>
+1
View File
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net471" />
<package id="Serilog" version="2.6.0" targetFramework="net471" />
<package id="Serilog.Enrichers.Thread" version="3.0.0" targetFramework="net471" />
<package id="Serilog.Formatting.Compact" version="1.0.0" targetFramework="net471" />
+21 -11
View File
@@ -18,20 +18,27 @@ namespace VocaluxeLib.Log
private static ILogger _SongLog = new SilentLogger();
private static string _LogFolder;
private static string _CrashMarkerFilePath;
private static ShowReporterDelegate _ShowReporterFunc;
private static string _CurrentVersion;
private const string _MainLogTemplate = "[{TimeStampFromStart}] [{Level}] {Message}{NewLine}{Properties}{NewLine}{Exception}";
private const string _SongLogTemplate = "{Message}{NewLine}Additional info:{Properties}{NewLine}{Exception}";
public static void Init(string logFolder, string fileNameMainLog, string fileNameSongInfoLog, string fileNameCrashMarker, string currentVersion)
public static void Init(string logFolder, string fileNameMainLog, string fileNameSongInfoLog, string fileNameCrashMarker, string currentVersion, ShowReporterDelegate showReporterFunc)
{
_LogFolder = logFolder;
_CrashMarkerFilePath = Path.Combine(_LogFolder, fileNameCrashMarker);
_ShowReporterFunc = showReporterFunc;
_CurrentVersion = currentVersion;
_CrashMarkerFilePath = Path.Combine(_LogFolder, fileNameCrashMarker);
// Creates the log directory if it does not exist
if (!Directory.Exists(_LogFolder))
Directory.CreateDirectory(_LogFolder);
var mainLogFilePath = Path.Combine(_LogFolder, fileNameMainLog);
var songLogFilePath = Path.Combine(_LogFolder, fileNameSongInfoLog);
// Check if crash marker file
if (File.Exists(_CrashMarkerFilePath))
{
@@ -45,17 +52,18 @@ namespace VocaluxeLib.Log
// Delete the old marker
File.Delete(_CrashMarkerFilePath);
if (currentVersion == versionTag)
if (_CurrentVersion == versionTag && File.Exists(mainLogFilePath))
{
// TODO: Load log + Crashreport
string logContent = File.ReadAllText(mainLogFilePath, Encoding.UTF8);
_ShowReporterFunc(crash:true, allowContinue:true, vocaluxeVersionTag:versionTag, log:logContent);
}
}
// Write new marker
File.WriteAllText(_CrashMarkerFilePath, currentVersion, Encoding.UTF8);
File.WriteAllText(_CrashMarkerFilePath, _CurrentVersion, Encoding.UTF8);
LogFileRoller.RollLogs(Path.Combine(_LogFolder, fileNameMainLog), 2);
LogFileRoller.RollLogs(Path.Combine(_LogFolder, fileNameSongInfoLog), 2);
LogFileRoller.RollLogs(mainLogFilePath, 2);
LogFileRoller.RollLogs(songLogFilePath, 2);
_MainLog = new LoggerConfiguration()
.Enrich.WithThreadId()
@@ -63,14 +71,14 @@ namespace VocaluxeLib.Log
.Enrich.WithTimeStampFromStart()
.WriteTo.TextWriter(_MainLogStringWriter, outputTemplate: _MainLogTemplate)
// Json can be activated by adding "new CompactJsonFormatter()" as first argument
.WriteTo.File(Path.Combine(_LogFolder, fileNameMainLog), flushToDiskInterval: TimeSpan.FromSeconds(30), outputTemplate: _MainLogTemplate)
.WriteTo.File(mainLogFilePath, flushToDiskInterval: TimeSpan.FromSeconds(30), outputTemplate: _MainLogTemplate)
#if DEBUG
.WriteTo.Console(outputTemplate: _MainLogTemplate)
#endif
.CreateLogger();
_SongLog = new LoggerConfiguration()
.WriteTo.File(Path.Combine(_LogFolder, fileNameSongInfoLog), flushToDiskInterval: TimeSpan.FromSeconds(60), outputTemplate: _SongLogTemplate)
.WriteTo.File(songLogFilePath, flushToDiskInterval: TimeSpan.FromSeconds(60), outputTemplate: _SongLogTemplate)
#if DEBUG
.WriteTo.Console(outputTemplate: "[SongInfo] " + _SongLogTemplate)
#endif
@@ -102,8 +110,10 @@ namespace VocaluxeLib.Log
private static void _ShowLogAssistent(string messageTemplate, object[] propertyValues, string callerMethodeName = "", string callerFilePath = "", int callerLineNumer = -1)
{
//Todo: Logsend assistent
//MessageBox.Show(messageTemplate, "Vocaluxe", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Flush the _MainLogStringWriter to get the latest entries to _MainLogStringBuilder
_MainLogStringWriter.Flush();
// Show the Reporter
_ShowReporterFunc(crash: true, allowContinue: true, vocaluxeVersionTag: _CurrentVersion, log: _MainLogStringBuilder.ToString());
}
}
+5
View File
@@ -0,0 +1,5 @@
namespace VocaluxeLib.Log
{
public delegate void ShowReporterDelegate(bool crash, bool allowContinue, string vocaluxeVersionTag, string log);
}
+1
View File
@@ -112,6 +112,7 @@
<Compile Include="CEncoding.cs" />
<Compile Include="CFading.cs" />
<Compile Include="CFont.cs" />
<Compile Include="Log\ShowReporterDelegate.cs" />
<Compile Include="Log\CLog.cs" />
<Compile Include="CVideoStream.cs" />
<Compile Include="Extensions.cs" />
+2 -1
View File
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Vocaluxe.Base;
using Vocaluxe.Reporting;
using VocaluxeLib;
using VocaluxeLib.Log;
using VocaluxeLib.PartyModes.Challenge;
@@ -47,7 +48,7 @@ namespace VocaluxeTests
public void TestRoundGeneration()
{
CBase.Game = new CBGame();
CLog.Init(CSettings.FolderNameLogs, CSettings.FileNameMainLog, CSettings.FileNameSongLog, CSettings.FileNameCrashMarker, CSettings.GetFullVersionText());
CLog.Init(CSettings.FolderNameLogs, CSettings.FileNameMainLog, CSettings.FileNameSongLog, CSettings.FileNameCrashMarker, CSettings.GetFullVersionText(), CReporter.ShowReporterFunc);
for (int i = 0; i < 10; i++)
{
for (int numPlayer = 1; numPlayer <= 20; numPlayer++)