From 2668bcd2ad7419457eec0431c638d644007240b9 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Tue, 11 Jun 2019 19:28:59 +0200 Subject: [PATCH 01/26] Start .Core 3 --- NLog.Windows.Forms.sln | 10 +- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 6 +- NLog.Windows.Forms/RichTextBoxTarget.cs | 26 +- TestApplicationCore3/Form1.Designer.cs | 86 + TestApplicationCore3/Form1.cs | 68 + TestApplicationCore3/Form1.resx | 123 + TestApplicationCore3/NLog.xsd | 2479 +++++++++++++++++ TestApplicationCore3/Program.cs | 22 + .../TestApplicationCore3.csproj | 34 + TestApplicationCore3/nlog.config | 71 + TestApplicationCore3/xlf/Form1.cs.xlf | 6 + TestApplicationCore3/xlf/Form1.de.xlf | 6 + TestApplicationCore3/xlf/Form1.es.xlf | 6 + TestApplicationCore3/xlf/Form1.fr.xlf | 6 + TestApplicationCore3/xlf/Form1.it.xlf | 6 + TestApplicationCore3/xlf/Form1.ja.xlf | 6 + TestApplicationCore3/xlf/Form1.ko.xlf | 6 + TestApplicationCore3/xlf/Form1.pl.xlf | 6 + TestApplicationCore3/xlf/Form1.pt-BR.xlf | 6 + TestApplicationCore3/xlf/Form1.ru.xlf | 6 + TestApplicationCore3/xlf/Form1.tr.xlf | 6 + TestApplicationCore3/xlf/Form1.zh-Hans.xlf | 6 + TestApplicationCore3/xlf/Form1.zh-Hant.xlf | 6 + appveyor.yml | 2 +- 24 files changed, 2987 insertions(+), 18 deletions(-) create mode 100644 TestApplicationCore3/Form1.Designer.cs create mode 100644 TestApplicationCore3/Form1.cs create mode 100644 TestApplicationCore3/Form1.resx create mode 100644 TestApplicationCore3/NLog.xsd create mode 100644 TestApplicationCore3/Program.cs create mode 100644 TestApplicationCore3/TestApplicationCore3.csproj create mode 100644 TestApplicationCore3/nlog.config create mode 100644 TestApplicationCore3/xlf/Form1.cs.xlf create mode 100644 TestApplicationCore3/xlf/Form1.de.xlf create mode 100644 TestApplicationCore3/xlf/Form1.es.xlf create mode 100644 TestApplicationCore3/xlf/Form1.fr.xlf create mode 100644 TestApplicationCore3/xlf/Form1.it.xlf create mode 100644 TestApplicationCore3/xlf/Form1.ja.xlf create mode 100644 TestApplicationCore3/xlf/Form1.ko.xlf create mode 100644 TestApplicationCore3/xlf/Form1.pl.xlf create mode 100644 TestApplicationCore3/xlf/Form1.pt-BR.xlf create mode 100644 TestApplicationCore3/xlf/Form1.ru.xlf create mode 100644 TestApplicationCore3/xlf/Form1.tr.xlf create mode 100644 TestApplicationCore3/xlf/Form1.zh-Hans.xlf create mode 100644 TestApplicationCore3/xlf/Form1.zh-Hant.xlf diff --git a/NLog.Windows.Forms.sln b/NLog.Windows.Forms.sln index e7cc002..6bf3c9d 100644 --- a/NLog.Windows.Forms.sln +++ b/NLog.Windows.Forms.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.645 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29001.49 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NLog.Windows.Forms", "NLog.Windows.Forms\NLog.Windows.Forms.csproj", "{EB5C7E87-C5F4-43FC-AC71-BE0A22F5B932}" EndProject @@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NLog.Windows.Forms.Tests", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplication", "TestApplication\TestApplication.csproj", "{03D9D89A-B972-4446-AB4A-A430851243D0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApplicationCore3", "TestApplicationCore3\TestApplicationCore3.csproj", "{9FAC81DA-0137-47E9-957A-D8A9A5215338}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {03D9D89A-B972-4446-AB4A-A430851243D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {03D9D89A-B972-4446-AB4A-A430851243D0}.Release|Any CPU.ActiveCfg = Release|Any CPU {03D9D89A-B972-4446-AB4A-A430851243D0}.Release|Any CPU.Build.0 = Release|Any CPU + {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index 14cecdc..a61d1d7 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -1,12 +1,12 @@ - + - net35 + net35;netcoreapp3.0 NLog.Windows.Forms NLog NLog.Windows.Forms Extend NLog with targets for Windows Forms applications. For example: writing to a richtextbox or raising alert popups. Copyright 2014-2019 - 4.3.0 + 4.4-beta1 true NLog https://nlog-project.org/N.png diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index 811ac54..4183dc9 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -89,7 +89,7 @@ public static void ReInitializeAllTextboxes(Form form) RichTextBox textboxControl = FormHelper.FindControl(textboxTarget.ControlName, form); if (textboxControl != null && !textboxControl.IsDisposed) { - if ( textboxTarget.TargetRichTextBox == null + if (textboxTarget.TargetRichTextBox == null || textboxTarget.TargetRichTextBox.IsDisposed || textboxTarget.TargetRichTextBox != textboxControl ) @@ -118,7 +118,7 @@ public static RichTextBoxTarget GetTargetByControl(RichTextBox control) } return null; } - + /// /// Initializes a new instance of the class. /// @@ -262,10 +262,10 @@ public RichTextBoxTarget() /// /// [DefaultValue(RichTextBoxTargetMessageRetentionStrategy.None)] - public RichTextBoxTargetMessageRetentionStrategy MessageRetention - { - get { return messageRetention; } - set + public RichTextBoxTargetMessageRetentionStrategy MessageRetention + { + get { return messageRetention; } + set { lock (messageQueueLock) { @@ -286,7 +286,7 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention } } } - } + } } /// @@ -315,7 +315,7 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention /// /// [DefaultValue(false)] - public bool SupportLinks + public bool SupportLinks { get { return supportLinks; } set @@ -687,7 +687,7 @@ protected override void Write(LogEventInfo logEvent) } else if (messageRetention == RichTextBoxTargetMessageRetentionStrategy.None) { - InternalLogger.Trace("Textbox for target {0} is {1}, skipping logging", this.Name, textbox == null? "null" : "disposed"); + InternalLogger.Trace("Textbox for target {0} is {1}, skipping logging", this.Name, textbox == null ? "null" : "disposed"); return; } } @@ -695,7 +695,7 @@ protected override void Write(LogEventInfo logEvent) string logMessage = Layout.Render(logEvent); RichTextBoxRowColoringRule matchingRule = FindMatchingRule(logEvent); - bool messageSent = DoSendMessageToTextbox(logMessage, matchingRule, logEvent); + bool messageSent = DoSendMessageToTextbox(logMessage, matchingRule, logEvent); if (messageSent) { @@ -812,7 +812,9 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori textBox.SelectionColor = GetColorFromString(rule.FontColor, textBox.ForeColor); textBox.SelectionFont = new Font(textBox.SelectionFont, textBox.SelectionFont.Style ^ rule.Style); textBox.AppendText(logMessage + "\n"); - textBox.SelectionLength = textBox.Text.Length - textBox.SelectionStart; + var textBoxSelectionLength = textBox.Text.Length - textBox.SelectionStart; + if (textBoxSelectionLength >= 0) + textBox.SelectionLength = textBoxSelectionLength; // find word to color foreach (RichTextBoxWordColoringRule wordRule in WordColoringRules) @@ -842,7 +844,7 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori bool linksAdded = false; textBox.SelectionStart = startIndex; - textBox.SelectionLength = textBox.Text.Length - textBox.SelectionStart; + textBox.SelectionLength = textBoxSelectionLength; string addedText = textBox.SelectedText; MatchCollection matches = linkAddRegex.Matches(addedText); //only access regex after checking SupportLinks, as it assures the initialization for (int i = matches.Count - 1; i >= 0; --i) //backwards order, so the string positions are not affected diff --git a/TestApplicationCore3/Form1.Designer.cs b/TestApplicationCore3/Form1.Designer.cs new file mode 100644 index 0000000..e23810b --- /dev/null +++ b/TestApplicationCore3/Form1.Designer.cs @@ -0,0 +1,86 @@ +namespace TestApplicationCore3 +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.richTextBox2 = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); + this.SuspendLayout(); + // + // fileSystemWatcher1 + // + this.fileSystemWatcher1.EnableRaisingEvents = true; + this.fileSystemWatcher1.SynchronizingObject = this; + // + // richTextBox1 + // + this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.richTextBox1.Location = new System.Drawing.Point(12, 12); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(320, 287); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = ""; + // + // richTextBox2 + // + this.richTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBox2.Location = new System.Drawing.Point(338, 12); + this.richTextBox2.Name = "richTextBox2"; + this.richTextBox2.Size = new System.Drawing.Size(320, 287); + this.richTextBox2.TabIndex = 1; + this.richTextBox2.Text = ""; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(671, 311); + this.Controls.Add(this.richTextBox2); + this.Controls.Add(this.richTextBox1); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.IO.FileSystemWatcher fileSystemWatcher1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.RichTextBox richTextBox2; + } +} + diff --git a/TestApplicationCore3/Form1.cs b/TestApplicationCore3/Form1.cs new file mode 100644 index 0000000..c147cfd --- /dev/null +++ b/TestApplicationCore3/Form1.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using NLog; +using NLog.Windows.Forms; + +namespace TestApplicationCore3 +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + + NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + Logger.Info("Init"); + + RichTextBoxTarget.ReInitializeAllTextboxes(this); + + var thread = new Thread(() => + { + Random rnd = new Random(); + for (int i = 0; i < 10; i++) + { + LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + if (rnd.NextDouble() > 0.1) + { + theEvent.Properties["ShowLink"] = "link via property"; + } + if (rnd.NextDouble() > 0.5) + { + theEvent.Properties["ShowLink2"] = "Another link"; + } + Logger.Log(theEvent); + Thread.Sleep(200); + } + Logger.Info("Done"); + }); + Logger.Info("start thread"); + thread.Start(); + + } + + private void Form1_Load(object sender, EventArgs e) + { + RichTextBoxTarget.GetTargetByControl(richTextBox1).LinkClicked += Form1_LinkClicked; + RichTextBoxTarget.GetTargetByControl(richTextBox2).LinkClicked += Form1_LinkClicked; + } + + private void Form1_LinkClicked(RichTextBoxTarget sender, string linkText, LogEventInfo logEvent) + { + //COM HRESULT E_FAIL happens when not used BeginInvoke and links are clicked while spinning + BeginInvokeLambda(this, + () => { MessageBox.Show("Clicked link '" + linkText + "' for event\n" + logEvent, sender.Name); } + ); + } + + private static IAsyncResult BeginInvokeLambda(Control control, Action action) + { + if (!control.IsDisposed) + { + return control.BeginInvoke(action, null); + } + return null; + } + } +} diff --git a/TestApplicationCore3/Form1.resx b/TestApplicationCore3/Form1.resx new file mode 100644 index 0000000..fc531d8 --- /dev/null +++ b/TestApplicationCore3/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/TestApplicationCore3/NLog.xsd b/TestApplicationCore3/NLog.xsd new file mode 100644 index 0000000..85019de --- /dev/null +++ b/TestApplicationCore3/NLog.xsd @@ -0,0 +1,2479 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Pass NLog internal exceptions to the application. Default value is: false. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to add <!-- --> comments around all written texts. + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to use default row highlighting rules. + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + The encoding for writing messages to the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Name of the database provider. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Value to be used as the event Source. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Maximum number of archive files that should be kept. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Gets ors set a value indicating whether a managed file stream is forced, instead of used the native implementation. + + + + + File attributes (Windows only). + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Log file buffer size in bytes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Encoding to be used for sending e-mail. + + + + + Indicates whether to add new lines between log entries. + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Priority used for sending mails. + + + + + Indicates the SMTP client timeout. + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used when writing text to the queue. + + + + + Indicates whether to use the XML format when serializing message. This will also disable creating queues. + + + + + Indicates whether to check if a queue exists before writing to it. + + + + + Indicates whether to create the queue if it doesn't exists. + + + + + Label to associate with each message. + + + + + Name of the queue to write to. + + + + + Indicates whether to use recoverable messages (with guaranteed delivery). + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + Performance counter instance name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Encoding. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Web service URL. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + + + + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/Program.cs b/TestApplicationCore3/Program.cs new file mode 100644 index 0000000..28c6368 --- /dev/null +++ b/TestApplicationCore3/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TestApplicationCore3 +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/TestApplicationCore3/TestApplicationCore3.csproj b/TestApplicationCore3/TestApplicationCore3.csproj new file mode 100644 index 0000000..d99983b --- /dev/null +++ b/TestApplicationCore3/TestApplicationCore3.csproj @@ -0,0 +1,34 @@ + + + + WinExe + netcoreapp3.0 + true + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/TestApplicationCore3/nlog.config b/TestApplicationCore3/nlog.config new file mode 100644 index 0000000..ebe436e --- /dev/null +++ b/TestApplicationCore3/nlog.config @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.cs.xlf b/TestApplicationCore3/xlf/Form1.cs.xlf new file mode 100644 index 0000000..aa40fae --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.cs.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.de.xlf b/TestApplicationCore3/xlf/Form1.de.xlf new file mode 100644 index 0000000..caab0ce --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.de.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.es.xlf b/TestApplicationCore3/xlf/Form1.es.xlf new file mode 100644 index 0000000..37761f8 --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.es.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.fr.xlf b/TestApplicationCore3/xlf/Form1.fr.xlf new file mode 100644 index 0000000..366eb9d --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.fr.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.it.xlf b/TestApplicationCore3/xlf/Form1.it.xlf new file mode 100644 index 0000000..e68d3fe --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.it.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ja.xlf b/TestApplicationCore3/xlf/Form1.ja.xlf new file mode 100644 index 0000000..2943ecc --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.ja.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ko.xlf b/TestApplicationCore3/xlf/Form1.ko.xlf new file mode 100644 index 0000000..83cb763 --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.ko.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.pl.xlf b/TestApplicationCore3/xlf/Form1.pl.xlf new file mode 100644 index 0000000..58b6edd --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.pl.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.pt-BR.xlf b/TestApplicationCore3/xlf/Form1.pt-BR.xlf new file mode 100644 index 0000000..073f6c0 --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.pt-BR.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ru.xlf b/TestApplicationCore3/xlf/Form1.ru.xlf new file mode 100644 index 0000000..5d784e2 --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.ru.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.tr.xlf b/TestApplicationCore3/xlf/Form1.tr.xlf new file mode 100644 index 0000000..9ae0ede --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.tr.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.zh-Hans.xlf b/TestApplicationCore3/xlf/Form1.zh-Hans.xlf new file mode 100644 index 0000000..2dbdc8d --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.zh-Hans.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.zh-Hant.xlf b/TestApplicationCore3/xlf/Form1.zh-Hant.xlf new file mode 100644 index 0000000..8782e52 --- /dev/null +++ b/TestApplicationCore3/xlf/Form1.zh-Hant.xlf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index cd308bf..29de610 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ version: 4.3.0.{build} -image: Visual Studio 2019 +image: Visual Studio 2019 preview clone_folder: c:\projects\nlog configuration: Release platform: Any CPU From 7c4e7be1d347baaf9b35dd60a90ad5ea778f97f3 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 14 Aug 2019 23:17:43 +0200 Subject: [PATCH 02/26] upgrade for rpeview 7 --- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index a61d1d7..e448101 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -18,6 +18,7 @@ true snupkg Full + true true @@ -30,9 +31,9 @@ git 4.0.0.0 4.0.0.0 - - Support snupkg -- Update dependency to lastest NLog -- Package improvements + + + From a891054eacc8a6d0a7f2e3f614ec018d4cefdd29 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 14 Aug 2019 23:20:32 +0200 Subject: [PATCH 03/26] install .net core 3 preview on appveyor --- appveyor.yml | 20 ++++++++++++++------ install.ps1 | 10 ++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 install.ps1 diff --git a/appveyor.yml b/appveyor.yml index 29de610..2c2cf07 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -25,9 +25,17 @@ artifacts: - path: '**\NLog.*.nupkg' - path: '**\NLog.*.snupkg' -deploy: -- provider: NuGet - api_key: - secure: DtVDH1ZfIR8E2oDLeSPxfn0WFXw3MCv4WhLkkQQl9LfEHswb5sdxdCYodNKhrKik - on: - branch: master +# deploy: +# - provider: NuGet +# api_key: +# secure: DtVDH1ZfIR8E2oDLeSPxfn0WFXw3MCv4WhLkkQQl9LfEHswb5sdxdCYodNKhrKik +# on: +# branch: master + + +environment: + DOTNET_VERSION: 3.0.100-preview7-012821 + +install: + - ps: .\install.ps1 + diff --git a/install.ps1 b/install.ps1 new file mode 100644 index 0000000..c987f6f --- /dev/null +++ b/install.ps1 @@ -0,0 +1,10 @@ +function install-dotnet-core { + if ($env:APPVEYOR -eq "True") { + $env:DOTNET_INSTALL_DIR = Join-Path "$(Convert-Path "$PSScriptRoot")" ".dotnetcli" + mkdir $env:DOTNET_INSTALL_DIR | Out-Null + $installScript = Join-Path $env:DOTNET_INSTALL_DIR "install.ps1" + Invoke-WebRequest "https://dot.net/v1/dotnet-install.ps1" -OutFile $installScript -UseBasicParsing + & $installScript -Version "$env:DOTNET_VERSION" -InstallDir "$env:DOTNET_INSTALL_DIR" + } +} +install-dotnet-core \ No newline at end of file From 38ebb7d8c422958110c33024c5c51efc7defabd7 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Thu, 15 Aug 2019 00:30:35 +0200 Subject: [PATCH 04/26] WIP --- NLog.Windows.Forms/RichTextBoxTarget.cs | 11 ++++--- TestApplication/Form1.cs | 40 ++++++++++++------------ TestApplicationCore3/Form1.cs | 40 ++++++++++++------------ img/core with chnage.png | Bin 0 -> 54314 bytes img/core without change.png | Bin 0 -> 22886 bytes img/expected.png | Bin 0 -> 23260 bytes 6 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 img/core with chnage.png create mode 100644 img/core without change.png create mode 100644 img/expected.png diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index 4183dc9..55bdc88 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -807,14 +807,15 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori RichTextBox textBox = TargetRichTextBox; int startIndex = textBox.Text.Length; + textBox.AppendText(logMessage + "\n"); + textBox.SelectionStart = startIndex; textBox.SelectionBackColor = GetColorFromString(rule.BackgroundColor, textBox.BackColor); textBox.SelectionColor = GetColorFromString(rule.FontColor, textBox.ForeColor); textBox.SelectionFont = new Font(textBox.SelectionFont, textBox.SelectionFont.Style ^ rule.Style); - textBox.AppendText(logMessage + "\n"); - var textBoxSelectionLength = textBox.Text.Length - textBox.SelectionStart; - if (textBoxSelectionLength >= 0) - textBox.SelectionLength = textBoxSelectionLength; + + var textBoxSelectionLength = textBox.Text.Length - startIndex; + textBox.SelectionLength = textBoxSelectionLength; // find word to color foreach (RichTextBoxWordColoringRule wordRule in WordColoringRules) @@ -844,7 +845,7 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori bool linksAdded = false; textBox.SelectionStart = startIndex; - textBox.SelectionLength = textBoxSelectionLength; + textBox.SelectionLength = textBox.Text.Length - textBox.SelectionStart; string addedText = textBox.SelectedText; MatchCollection matches = linkAddRegex.Matches(addedText); //only access regex after checking SupportLinks, as it assures the initialization for (int i = matches.Count - 1; i >= 0; --i) //backwards order, so the string positions are not affected diff --git a/TestApplication/Form1.cs b/TestApplication/Form1.cs index de1096a..07325f7 100644 --- a/TestApplication/Form1.cs +++ b/TestApplication/Form1.cs @@ -25,27 +25,27 @@ public Form1() RichTextBoxTarget.ReInitializeAllTextboxes(this); - var thread = new Thread(() => - { - Random rnd = new Random(); - for (int i = 0; i < 10; i++) - { - LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); - if (rnd.NextDouble() > 0.1) - { - theEvent.Properties["ShowLink"] = "link via property"; - } - if (rnd.NextDouble() > 0.5) - { - theEvent.Properties["ShowLink2"] = "Another link"; - } - Logger.Log(theEvent); - Thread.Sleep(200); - } - Logger.Info("Done"); - }); + //var thread = new Thread(() => + //{ + // Random rnd = new Random(); + // for (int i = 0; i < 1; i++) + // { + // LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + // if (rnd.NextDouble() > 0.1) + // { + // theEvent.Properties["ShowLink"] = "link via property"; + // } + // if (rnd.NextDouble() > 0.5) + // { + // theEvent.Properties["ShowLink2"] = "Another link"; + // } + // Logger.Log(theEvent); + // Thread.Sleep(200); + // } + // Logger.Info("Done"); + //}); Logger.Info("start thread"); - thread.Start(); + // thread.Start(); } diff --git a/TestApplicationCore3/Form1.cs b/TestApplicationCore3/Form1.cs index c147cfd..c0aa1b2 100644 --- a/TestApplicationCore3/Form1.cs +++ b/TestApplicationCore3/Form1.cs @@ -18,27 +18,27 @@ public Form1() RichTextBoxTarget.ReInitializeAllTextboxes(this); - var thread = new Thread(() => - { - Random rnd = new Random(); - for (int i = 0; i < 10; i++) - { - LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); - if (rnd.NextDouble() > 0.1) - { - theEvent.Properties["ShowLink"] = "link via property"; - } - if (rnd.NextDouble() > 0.5) - { - theEvent.Properties["ShowLink2"] = "Another link"; - } - Logger.Log(theEvent); - Thread.Sleep(200); - } - Logger.Info("Done"); - }); + //var thread = new Thread(() => + //{ + // Random rnd = new Random(); + // for (int i = 0; i < 10; i++) + // { + // LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + // if (rnd.NextDouble() > 0.1) + // { + // theEvent.Properties["ShowLink"] = "link via property"; + // } + // if (rnd.NextDouble() > 0.5) + // { + // theEvent.Properties["ShowLink2"] = "Another link"; + // } + // Logger.Log(theEvent); + // Thread.Sleep(200); + // } + // Logger.Info("Done"); + //}); Logger.Info("start thread"); - thread.Start(); + // thread.Start(); } diff --git a/img/core with chnage.png b/img/core with chnage.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb927f0a09ee79c04918d1f8cf476053ef39cee GIT binary patch literal 54314 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 NVHZzC)j{-)-vRB~A>04} literal 0 HcmV?d00001 From b713faed3a020e848d6b9cdb9ac5a3396facee09 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:33:02 +0100 Subject: [PATCH 05/26] revert unneeded changes --- TestApplication/Form1.cs | 40 ++++++++++----------- TestApplicationCore3/xlf/Form1.cs.xlf | 6 ---- TestApplicationCore3/xlf/Form1.de.xlf | 6 ---- TestApplicationCore3/xlf/Form1.es.xlf | 6 ---- TestApplicationCore3/xlf/Form1.fr.xlf | 6 ---- TestApplicationCore3/xlf/Form1.it.xlf | 6 ---- TestApplicationCore3/xlf/Form1.ja.xlf | 6 ---- TestApplicationCore3/xlf/Form1.ko.xlf | 6 ---- TestApplicationCore3/xlf/Form1.pl.xlf | 6 ---- TestApplicationCore3/xlf/Form1.pt-BR.xlf | 6 ---- TestApplicationCore3/xlf/Form1.ru.xlf | 6 ---- TestApplicationCore3/xlf/Form1.tr.xlf | 6 ---- TestApplicationCore3/xlf/Form1.zh-Hans.xlf | 6 ---- TestApplicationCore3/xlf/Form1.zh-Hant.xlf | 6 ---- appveyor.yml | 2 +- img/core with chnage.png | Bin 54314 -> 0 bytes img/core without change.png | Bin 22886 -> 0 bytes img/expected.png | Bin 23260 -> 0 bytes install.ps1 | 10 ------ 19 files changed, 21 insertions(+), 109 deletions(-) delete mode 100644 TestApplicationCore3/xlf/Form1.cs.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.de.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.es.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.fr.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.it.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.ja.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.ko.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.pl.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.pt-BR.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.ru.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.tr.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.zh-Hans.xlf delete mode 100644 TestApplicationCore3/xlf/Form1.zh-Hant.xlf delete mode 100644 img/core with chnage.png delete mode 100644 img/core without change.png delete mode 100644 img/expected.png delete mode 100644 install.ps1 diff --git a/TestApplication/Form1.cs b/TestApplication/Form1.cs index 07325f7..de1096a 100644 --- a/TestApplication/Form1.cs +++ b/TestApplication/Form1.cs @@ -25,27 +25,27 @@ public Form1() RichTextBoxTarget.ReInitializeAllTextboxes(this); - //var thread = new Thread(() => - //{ - // Random rnd = new Random(); - // for (int i = 0; i < 1; i++) - // { - // LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); - // if (rnd.NextDouble() > 0.1) - // { - // theEvent.Properties["ShowLink"] = "link via property"; - // } - // if (rnd.NextDouble() > 0.5) - // { - // theEvent.Properties["ShowLink2"] = "Another link"; - // } - // Logger.Log(theEvent); - // Thread.Sleep(200); - // } - // Logger.Info("Done"); - //}); + var thread = new Thread(() => + { + Random rnd = new Random(); + for (int i = 0; i < 10; i++) + { + LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + if (rnd.NextDouble() > 0.1) + { + theEvent.Properties["ShowLink"] = "link via property"; + } + if (rnd.NextDouble() > 0.5) + { + theEvent.Properties["ShowLink2"] = "Another link"; + } + Logger.Log(theEvent); + Thread.Sleep(200); + } + Logger.Info("Done"); + }); Logger.Info("start thread"); - // thread.Start(); + thread.Start(); } diff --git a/TestApplicationCore3/xlf/Form1.cs.xlf b/TestApplicationCore3/xlf/Form1.cs.xlf deleted file mode 100644 index aa40fae..0000000 --- a/TestApplicationCore3/xlf/Form1.cs.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.de.xlf b/TestApplicationCore3/xlf/Form1.de.xlf deleted file mode 100644 index caab0ce..0000000 --- a/TestApplicationCore3/xlf/Form1.de.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.es.xlf b/TestApplicationCore3/xlf/Form1.es.xlf deleted file mode 100644 index 37761f8..0000000 --- a/TestApplicationCore3/xlf/Form1.es.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.fr.xlf b/TestApplicationCore3/xlf/Form1.fr.xlf deleted file mode 100644 index 366eb9d..0000000 --- a/TestApplicationCore3/xlf/Form1.fr.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.it.xlf b/TestApplicationCore3/xlf/Form1.it.xlf deleted file mode 100644 index e68d3fe..0000000 --- a/TestApplicationCore3/xlf/Form1.it.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ja.xlf b/TestApplicationCore3/xlf/Form1.ja.xlf deleted file mode 100644 index 2943ecc..0000000 --- a/TestApplicationCore3/xlf/Form1.ja.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ko.xlf b/TestApplicationCore3/xlf/Form1.ko.xlf deleted file mode 100644 index 83cb763..0000000 --- a/TestApplicationCore3/xlf/Form1.ko.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.pl.xlf b/TestApplicationCore3/xlf/Form1.pl.xlf deleted file mode 100644 index 58b6edd..0000000 --- a/TestApplicationCore3/xlf/Form1.pl.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.pt-BR.xlf b/TestApplicationCore3/xlf/Form1.pt-BR.xlf deleted file mode 100644 index 073f6c0..0000000 --- a/TestApplicationCore3/xlf/Form1.pt-BR.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.ru.xlf b/TestApplicationCore3/xlf/Form1.ru.xlf deleted file mode 100644 index 5d784e2..0000000 --- a/TestApplicationCore3/xlf/Form1.ru.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.tr.xlf b/TestApplicationCore3/xlf/Form1.tr.xlf deleted file mode 100644 index 9ae0ede..0000000 --- a/TestApplicationCore3/xlf/Form1.tr.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.zh-Hans.xlf b/TestApplicationCore3/xlf/Form1.zh-Hans.xlf deleted file mode 100644 index 2dbdc8d..0000000 --- a/TestApplicationCore3/xlf/Form1.zh-Hans.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TestApplicationCore3/xlf/Form1.zh-Hant.xlf b/TestApplicationCore3/xlf/Form1.zh-Hant.xlf deleted file mode 100644 index 8782e52..0000000 --- a/TestApplicationCore3/xlf/Form1.zh-Hant.xlf +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 80b7838..c625e1f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ version: 4.3.0.{build} -image: Visual Studio 2019 preview +image: Visual Studio 2019 clone_folder: c:\projects\nlog configuration: Release platform: Any CPU diff --git a/img/core with chnage.png b/img/core with chnage.png deleted file mode 100644 index 1cb927f0a09ee79c04918d1f8cf476053ef39cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54314 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 NVHZzC)j{-)-vRB~A>04} diff --git a/install.ps1 b/install.ps1 deleted file mode 100644 index c987f6f..0000000 --- a/install.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -function install-dotnet-core { - if ($env:APPVEYOR -eq "True") { - $env:DOTNET_INSTALL_DIR = Join-Path "$(Convert-Path "$PSScriptRoot")" ".dotnetcli" - mkdir $env:DOTNET_INSTALL_DIR | Out-Null - $installScript = Join-Path $env:DOTNET_INSTALL_DIR "install.ps1" - Invoke-WebRequest "https://dot.net/v1/dotnet-install.ps1" -OutFile $installScript -UseBasicParsing - & $installScript -Version "$env:DOTNET_VERSION" -InstallDir "$env:DOTNET_INSTALL_DIR" - } -} -install-dotnet-core \ No newline at end of file From d4a046117512ce71160a0772aa3e4864a4f63c29 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:38:17 +0100 Subject: [PATCH 06/26] cleanup --- TestApplication/Program.cs | 11 ----------- TestApplicationCore3/Program.cs | 2 -- 2 files changed, 13 deletions(-) diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs index 582dea0..bb5e548 100644 --- a/TestApplication/Program.cs +++ b/TestApplication/Program.cs @@ -1,31 +1,20 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Forms; -using NLog; namespace TestApplication { static class Program { - - /// /// The main entry point for the application. /// [STAThread] static void Main() { - - Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); - - - } } } diff --git a/TestApplicationCore3/Program.cs b/TestApplicationCore3/Program.cs index 28c6368..7e2bbdc 100644 --- a/TestApplicationCore3/Program.cs +++ b/TestApplicationCore3/Program.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; namespace TestApplicationCore3 From a5b96ffed49d83a9eabbbc1cbde1b1ce0455a5ad Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:39:57 +0100 Subject: [PATCH 07/26] testprogram --- TestApplicationCore3/Form1.cs | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/TestApplicationCore3/Form1.cs b/TestApplicationCore3/Form1.cs index c0aa1b2..9241b56 100644 --- a/TestApplicationCore3/Form1.cs +++ b/TestApplicationCore3/Form1.cs @@ -15,30 +15,30 @@ public Form1() NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); Logger.Info("Init"); - + RichTextBoxTarget.ReInitializeAllTextboxes(this); - //var thread = new Thread(() => - //{ - // Random rnd = new Random(); - // for (int i = 0; i < 10; i++) - // { - // LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); - // if (rnd.NextDouble() > 0.1) - // { - // theEvent.Properties["ShowLink"] = "link via property"; - // } - // if (rnd.NextDouble() > 0.5) - // { - // theEvent.Properties["ShowLink2"] = "Another link"; - // } - // Logger.Log(theEvent); - // Thread.Sleep(200); - // } - // Logger.Info("Done"); - //}); + var thread = new Thread(() => + { + Random rnd = new Random(); + for (int i = 0; i < 10; i++) + { + LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + if (rnd.NextDouble() > 0.1) + { + theEvent.Properties["ShowLink"] = "link via property"; + } + if (rnd.NextDouble() > 0.5) + { + theEvent.Properties["ShowLink2"] = "Another link"; + } + Logger.Log(theEvent); + Thread.Sleep(200); + } + Logger.Info("Done"); + }); Logger.Info("start thread"); - // thread.Start(); + thread.Start(); } From 2f4b9737c386e775c9032bdc80ab00bfdfa74457 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:47:22 +0100 Subject: [PATCH 08/26] disable for .NET Core 3 --- NLog.Windows.Forms/RichTextBoxTarget.cs | 34 +++++++++++++++---------- TestApplicationCore3/nlog.config | 2 -- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index 55bdc88..ad93dca 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -310,6 +310,13 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention /// private volatile Queue messageQueue; +#if !NETCOREAPP3_0 // this is an issue in .NET Core 3 - see https://github.com/dotnet/winforms/issues/3399, but fixed in .MET 5 + + /// + /// Actual value of the property + /// + private bool supportLinks; + /// /// If set to true, using "rtb-link" renderer () would create clickable links in the control. /// @@ -343,6 +350,15 @@ public bool SupportLinks } } + /// + /// Used to synchronize lazy initialization of and in .set + /// + private static readonly object linkRegexLock = new object(); +#else + + private bool SupportLinks = false; +#endif + /// /// Type of delegate for event. /// @@ -357,11 +373,6 @@ public bool SupportLinks /// public event DelLinkClicked LinkClicked; - /// - /// Actual value of the property - /// - private bool supportLinks; - /// /// Lock for dictionary access /// @@ -370,7 +381,7 @@ public bool SupportLinks /// /// A map from link id to a corresponding log event /// - private Dictionary linkedEvents; + private Dictionary linkedEvents = null; /// /// Returns number of events stored for active links in the control. @@ -396,22 +407,19 @@ internal int? LinkedEventsCount /// private const string LinkPrefix = "link"; - /// - /// Used to synchronize lazy initialization of and in .set - /// - private static readonly object linkRegexLock = new object(); + /// /// Used to capture link placeholders in /// Lazily initialized in .set(true). Assure checking before accessing the field /// - private static Regex linkAddRegex; + private static Regex linkAddRegex = null; /// /// Used to parse RTF with links when removing excess lines in /// Lazily initialized in .set(true). Assure checking before accessing the field /// - private static Regex linkRemoveRtfRegex; + private static Regex linkRemoveRtfRegex = null; /// @@ -813,7 +821,7 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori textBox.SelectionBackColor = GetColorFromString(rule.BackgroundColor, textBox.BackColor); textBox.SelectionColor = GetColorFromString(rule.FontColor, textBox.ForeColor); textBox.SelectionFont = new Font(textBox.SelectionFont, textBox.SelectionFont.Style ^ rule.Style); - + var textBoxSelectionLength = textBox.Text.Length - startIndex; textBox.SelectionLength = textBoxSelectionLength; diff --git a/TestApplicationCore3/nlog.config b/TestApplicationCore3/nlog.config index ebe436e..0a08c46 100644 --- a/TestApplicationCore3/nlog.config +++ b/TestApplicationCore3/nlog.config @@ -29,7 +29,6 @@ allowAccessoryFormCreation="false" messageRetention="OnlyMissed" - supportLinks="true" useDefaultRowColoringRules="true" /> @@ -45,7 +44,6 @@ allowAccessoryFormCreation="false" messageRetention="OnlyMissed" - supportLinks="true" useDefaultRowColoringRules="true" /> From 01bbf1a1258f6062d5e9c0f73817806b74aa8193 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:52:48 +0100 Subject: [PATCH 09/26] .NET 5 --- NLog.Windows.Forms.sln | 8 +- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 2 +- TestApplicationNet5/Form1.Designer.cs | 86 + TestApplicationNet5/Form1.cs | 68 + TestApplicationNet5/Form1.resx | 123 + TestApplicationNet5/NLog.xsd | 2479 +++++++++++++++++ TestApplicationNet5/Program.cs | 20 + .../TestApplicationNet5.csproj | 34 + TestApplicationNet5/nlog.config | 71 + 9 files changed, 2889 insertions(+), 2 deletions(-) create mode 100644 TestApplicationNet5/Form1.Designer.cs create mode 100644 TestApplicationNet5/Form1.cs create mode 100644 TestApplicationNet5/Form1.resx create mode 100644 TestApplicationNet5/NLog.xsd create mode 100644 TestApplicationNet5/Program.cs create mode 100644 TestApplicationNet5/TestApplicationNet5.csproj create mode 100644 TestApplicationNet5/nlog.config diff --git a/NLog.Windows.Forms.sln b/NLog.Windows.Forms.sln index 6bf3c9d..9eb5225 100644 --- a/NLog.Windows.Forms.sln +++ b/NLog.Windows.Forms.sln @@ -9,7 +9,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NLog.Windows.Forms.Tests", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplication", "TestApplication\TestApplication.csproj", "{03D9D89A-B972-4446-AB4A-A430851243D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApplicationCore3", "TestApplicationCore3\TestApplicationCore3.csproj", "{9FAC81DA-0137-47E9-957A-D8A9A5215338}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplicationCore3", "TestApplicationCore3\TestApplicationCore3.csproj", "{9FAC81DA-0137-47E9-957A-D8A9A5215338}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplicationNet5", "TestApplicationNet5\TestApplicationNet5.csproj", "{134980CC-0226-42B1-B02F-A9C81AAB0A3D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -33,6 +35,10 @@ Global {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FAC81DA-0137-47E9-957A-D8A9A5215338}.Release|Any CPU.Build.0 = Release|Any CPU + {134980CC-0226-42B1-B02F-A9C81AAB0A3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {134980CC-0226-42B1-B02F-A9C81AAB0A3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {134980CC-0226-42B1-B02F-A9C81AAB0A3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {134980CC-0226-42B1-B02F-A9C81AAB0A3D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index 52d1cb5..b974652 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -1,6 +1,6 @@  - net35;netcoreapp3.0 + net35;netcoreapp3.0;net5.0-windows NLog.Windows.Forms NLog NLog.Windows.Forms diff --git a/TestApplicationNet5/Form1.Designer.cs b/TestApplicationNet5/Form1.Designer.cs new file mode 100644 index 0000000..e23810b --- /dev/null +++ b/TestApplicationNet5/Form1.Designer.cs @@ -0,0 +1,86 @@ +namespace TestApplicationCore3 +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.richTextBox2 = new System.Windows.Forms.RichTextBox(); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); + this.SuspendLayout(); + // + // fileSystemWatcher1 + // + this.fileSystemWatcher1.EnableRaisingEvents = true; + this.fileSystemWatcher1.SynchronizingObject = this; + // + // richTextBox1 + // + this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.richTextBox1.Location = new System.Drawing.Point(12, 12); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(320, 287); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = ""; + // + // richTextBox2 + // + this.richTextBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBox2.Location = new System.Drawing.Point(338, 12); + this.richTextBox2.Name = "richTextBox2"; + this.richTextBox2.Size = new System.Drawing.Size(320, 287); + this.richTextBox2.TabIndex = 1; + this.richTextBox2.Text = ""; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(671, 311); + this.Controls.Add(this.richTextBox2); + this.Controls.Add(this.richTextBox1); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.IO.FileSystemWatcher fileSystemWatcher1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.RichTextBox richTextBox2; + } +} + diff --git a/TestApplicationNet5/Form1.cs b/TestApplicationNet5/Form1.cs new file mode 100644 index 0000000..9241b56 --- /dev/null +++ b/TestApplicationNet5/Form1.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using NLog; +using NLog.Windows.Forms; + +namespace TestApplicationCore3 +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + + NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + Logger.Info("Init"); + + RichTextBoxTarget.ReInitializeAllTextboxes(this); + + var thread = new Thread(() => + { + Random rnd = new Random(); + for (int i = 0; i < 10; i++) + { + LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); + if (rnd.NextDouble() > 0.1) + { + theEvent.Properties["ShowLink"] = "link via property"; + } + if (rnd.NextDouble() > 0.5) + { + theEvent.Properties["ShowLink2"] = "Another link"; + } + Logger.Log(theEvent); + Thread.Sleep(200); + } + Logger.Info("Done"); + }); + Logger.Info("start thread"); + thread.Start(); + + } + + private void Form1_Load(object sender, EventArgs e) + { + RichTextBoxTarget.GetTargetByControl(richTextBox1).LinkClicked += Form1_LinkClicked; + RichTextBoxTarget.GetTargetByControl(richTextBox2).LinkClicked += Form1_LinkClicked; + } + + private void Form1_LinkClicked(RichTextBoxTarget sender, string linkText, LogEventInfo logEvent) + { + //COM HRESULT E_FAIL happens when not used BeginInvoke and links are clicked while spinning + BeginInvokeLambda(this, + () => { MessageBox.Show("Clicked link '" + linkText + "' for event\n" + logEvent, sender.Name); } + ); + } + + private static IAsyncResult BeginInvokeLambda(Control control, Action action) + { + if (!control.IsDisposed) + { + return control.BeginInvoke(action, null); + } + return null; + } + } +} diff --git a/TestApplicationNet5/Form1.resx b/TestApplicationNet5/Form1.resx new file mode 100644 index 0000000..fc531d8 --- /dev/null +++ b/TestApplicationNet5/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/TestApplicationNet5/NLog.xsd b/TestApplicationNet5/NLog.xsd new file mode 100644 index 0000000..85019de --- /dev/null +++ b/TestApplicationNet5/NLog.xsd @@ -0,0 +1,2479 @@ + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged.. + + + + + Pass NLog internal exceptions to the application. Default value is: false. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Name of the logger. May include '*' character which acts like a wildcard. Allowed forms are: *, Name, *Name, Name* and *Name* + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable or disable logging rule. Disabled rules are ignored. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to add <!-- --> comments around all written texts. + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Time in milliseconds to sleep between batches. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Viewer parameter name. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to use default row highlighting rules. + + + + + The encoding for writing messages to the . + + + + + Indicates whether the error stream (stderr) should be used instead of the output stream (stdout). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + Background color. + + + + + Foreground color. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + The encoding for writing messages to the . + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Name of the database provider. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + Layout that should be use to calcuate the value for the parameter. + + + + + Database parameter name. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Database parameter size. + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Value to be used as the event Source. + + + + + Optional entrytype. When not set, or when not convertable to then determined by + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + File encoding. + + + + + Line ending mode. + + + + + Maximum number of archive files that should be kept. + + + + + Way file archives are numbered. + + + + + Name of the file to be used for an archive. + + + + + Indicates whether to automatically archive log files every time the specified time passes. + + + + + Size in bytes above which log files will be automatically archived. + + + + + Indicates whether to compress archive files into the zip archive format. + + + + + Gets ors set a value indicating whether a managed file stream is forced, instead of used the native implementation. + + + + + File attributes (Windows only). + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Name of the file to write to. + + + + + Value specifying the date format to use when archving files. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + + + + + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Log file buffer size in bytes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + + + + + + + + + + Layout that should be use to calculate the value for the parameter. + + + + + Name of the parameter. + + + + + Type of the parameter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Encoding to be used for sending e-mail. + + + + + Indicates whether to add new lines between log entries. + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Priority used for sending mails. + + + + + Indicates the SMTP client timeout. + + + + + SMTP Server to be used for sending. + + + + + SMTP Authentication mode. + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Port number that SMTP Server is listening on. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used when writing text to the queue. + + + + + Indicates whether to use the XML format when serializing message. This will also disable creating queues. + + + + + Indicates whether to check if a queue exists before writing to it. + + + + + Indicates whether to create the queue if it doesn't exists. + + + + + Label to associate with each message. + + + + + Name of the queue to write to. + + + + + Indicates whether to use recoverable messages (with guaranteed delivery). + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Network address. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding to be used. + + + + + Instance of that is used to format log messages. + + + + + Maximum message size in bytes. + + + + + Indicates whether to append newline at the end of log message. + + + + + Action that should be taken if the message is larger than maxMessageSize. + + + + + Size of the connection cache (number of connections which are kept alive). + + + + + Network address. + + + + + Indicates whether to keep connection open whenever possible. + + + + + Maximum queue size. + + + + + Indicates whether to include NLog-specific extensions to log4j schema. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + NDC item separator. + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + AppInfo field. By default it's the friendly name of the current AppDomain. + + + + + Indicates whether to include stack contents. + + + + + Indicates whether to include dictionary contents. + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + Performance counter instance name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the property. This will only work for UTF-8. + + + + + Encoding. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Web service URL. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom'). + + + + + Column delimiter. + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Layout of the column. + + + + + Name of the column. + + + + + + + + + + + + + + + + + + + + Layout that will be rendered as the attribute's value. + + + + + Name of the attribute. + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + + + + Layout text. + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TestApplicationNet5/Program.cs b/TestApplicationNet5/Program.cs new file mode 100644 index 0000000..7e2bbdc --- /dev/null +++ b/TestApplicationNet5/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Linq; +using System.Windows.Forms; + +namespace TestApplicationCore3 +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/TestApplicationNet5/TestApplicationNet5.csproj b/TestApplicationNet5/TestApplicationNet5.csproj new file mode 100644 index 0000000..87f148c --- /dev/null +++ b/TestApplicationNet5/TestApplicationNet5.csproj @@ -0,0 +1,34 @@ + + + + WinExe + net5.0-windows + true + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + + + + PreserveNewest + + + + \ No newline at end of file diff --git a/TestApplicationNet5/nlog.config b/TestApplicationNet5/nlog.config new file mode 100644 index 0000000..ebe436e --- /dev/null +++ b/TestApplicationNet5/nlog.config @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 8fe7911ee3a32a7d851b887651ee3e4606de7aa3 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 22:53:17 +0100 Subject: [PATCH 10/26] cleanup --- TestApplicationCore3/Form1.cs | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/TestApplicationCore3/Form1.cs b/TestApplicationCore3/Form1.cs index 9241b56..0e15cfe 100644 --- a/TestApplicationCore3/Form1.cs +++ b/TestApplicationCore3/Form1.cs @@ -24,14 +24,6 @@ public Form1() for (int i = 0; i < 10; i++) { LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", i + ": a line with some length\n a new line"); - if (rnd.NextDouble() > 0.1) - { - theEvent.Properties["ShowLink"] = "link via property"; - } - if (rnd.NextDouble() > 0.5) - { - theEvent.Properties["ShowLink2"] = "Another link"; - } Logger.Log(theEvent); Thread.Sleep(200); } @@ -44,25 +36,6 @@ public Form1() private void Form1_Load(object sender, EventArgs e) { - RichTextBoxTarget.GetTargetByControl(richTextBox1).LinkClicked += Form1_LinkClicked; - RichTextBoxTarget.GetTargetByControl(richTextBox2).LinkClicked += Form1_LinkClicked; - } - - private void Form1_LinkClicked(RichTextBoxTarget sender, string linkText, LogEventInfo logEvent) - { - //COM HRESULT E_FAIL happens when not used BeginInvoke and links are clicked while spinning - BeginInvokeLambda(this, - () => { MessageBox.Show("Clicked link '" + linkText + "' for event\n" + logEvent, sender.Name); } - ); - } - - private static IAsyncResult BeginInvokeLambda(Control control, Action action) - { - if (!control.IsDisposed) - { - return control.BeginInvoke(action, null); - } - return null; } } } From a6d44aa50be31b0af012872b6d5324c712f3f0c3 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 23:00:17 +0100 Subject: [PATCH 11/26] test colors --- NLog.Windows.Forms/RichTextBoxTarget.cs | 59 ++++++++++--------------- TestApplication/Form1.cs | 7 +++ TestApplication/nlog.config | 8 ++-- TestApplicationCore3/Form1.cs | 7 +++ TestApplicationCore3/nlog.config | 6 +-- TestApplicationNet5/Form1.cs | 7 +++ TestApplicationNet5/nlog.config | 6 +-- 7 files changed, 55 insertions(+), 45 deletions(-) diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index ad93dca..811ac54 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -89,7 +89,7 @@ public static void ReInitializeAllTextboxes(Form form) RichTextBox textboxControl = FormHelper.FindControl(textboxTarget.ControlName, form); if (textboxControl != null && !textboxControl.IsDisposed) { - if (textboxTarget.TargetRichTextBox == null + if ( textboxTarget.TargetRichTextBox == null || textboxTarget.TargetRichTextBox.IsDisposed || textboxTarget.TargetRichTextBox != textboxControl ) @@ -118,7 +118,7 @@ public static RichTextBoxTarget GetTargetByControl(RichTextBox control) } return null; } - + /// /// Initializes a new instance of the class. /// @@ -262,10 +262,10 @@ public RichTextBoxTarget() /// /// [DefaultValue(RichTextBoxTargetMessageRetentionStrategy.None)] - public RichTextBoxTargetMessageRetentionStrategy MessageRetention - { - get { return messageRetention; } - set + public RichTextBoxTargetMessageRetentionStrategy MessageRetention + { + get { return messageRetention; } + set { lock (messageQueueLock) { @@ -286,7 +286,7 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention } } } - } + } } /// @@ -310,19 +310,12 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention /// private volatile Queue messageQueue; -#if !NETCOREAPP3_0 // this is an issue in .NET Core 3 - see https://github.com/dotnet/winforms/issues/3399, but fixed in .MET 5 - - /// - /// Actual value of the property - /// - private bool supportLinks; - /// /// If set to true, using "rtb-link" renderer () would create clickable links in the control. /// /// [DefaultValue(false)] - public bool SupportLinks + public bool SupportLinks { get { return supportLinks; } set @@ -350,15 +343,6 @@ public bool SupportLinks } } - /// - /// Used to synchronize lazy initialization of and in .set - /// - private static readonly object linkRegexLock = new object(); -#else - - private bool SupportLinks = false; -#endif - /// /// Type of delegate for event. /// @@ -373,6 +357,11 @@ public bool SupportLinks /// public event DelLinkClicked LinkClicked; + /// + /// Actual value of the property + /// + private bool supportLinks; + /// /// Lock for dictionary access /// @@ -381,7 +370,7 @@ public bool SupportLinks /// /// A map from link id to a corresponding log event /// - private Dictionary linkedEvents = null; + private Dictionary linkedEvents; /// /// Returns number of events stored for active links in the control. @@ -407,19 +396,22 @@ internal int? LinkedEventsCount /// private const string LinkPrefix = "link"; - + /// + /// Used to synchronize lazy initialization of and in .set + /// + private static readonly object linkRegexLock = new object(); /// /// Used to capture link placeholders in /// Lazily initialized in .set(true). Assure checking before accessing the field /// - private static Regex linkAddRegex = null; + private static Regex linkAddRegex; /// /// Used to parse RTF with links when removing excess lines in /// Lazily initialized in .set(true). Assure checking before accessing the field /// - private static Regex linkRemoveRtfRegex = null; + private static Regex linkRemoveRtfRegex; /// @@ -695,7 +687,7 @@ protected override void Write(LogEventInfo logEvent) } else if (messageRetention == RichTextBoxTargetMessageRetentionStrategy.None) { - InternalLogger.Trace("Textbox for target {0} is {1}, skipping logging", this.Name, textbox == null ? "null" : "disposed"); + InternalLogger.Trace("Textbox for target {0} is {1}, skipping logging", this.Name, textbox == null? "null" : "disposed"); return; } } @@ -703,7 +695,7 @@ protected override void Write(LogEventInfo logEvent) string logMessage = Layout.Render(logEvent); RichTextBoxRowColoringRule matchingRule = FindMatchingRule(logEvent); - bool messageSent = DoSendMessageToTextbox(logMessage, matchingRule, logEvent); + bool messageSent = DoSendMessageToTextbox(logMessage, matchingRule, logEvent); if (messageSent) { @@ -815,15 +807,12 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori RichTextBox textBox = TargetRichTextBox; int startIndex = textBox.Text.Length; - textBox.AppendText(logMessage + "\n"); - textBox.SelectionStart = startIndex; textBox.SelectionBackColor = GetColorFromString(rule.BackgroundColor, textBox.BackColor); textBox.SelectionColor = GetColorFromString(rule.FontColor, textBox.ForeColor); textBox.SelectionFont = new Font(textBox.SelectionFont, textBox.SelectionFont.Style ^ rule.Style); - - var textBoxSelectionLength = textBox.Text.Length - startIndex; - textBox.SelectionLength = textBoxSelectionLength; + textBox.AppendText(logMessage + "\n"); + textBox.SelectionLength = textBox.Text.Length - textBox.SelectionStart; // find word to color foreach (RichTextBoxWordColoringRule wordRule in WordColoringRules) diff --git a/TestApplication/Form1.cs b/TestApplication/Form1.cs index de1096a..1a5981e 100644 --- a/TestApplication/Form1.cs +++ b/TestApplication/Form1.cs @@ -24,6 +24,13 @@ public Form1() Logger.Info("Init"); RichTextBoxTarget.ReInitializeAllTextboxes(this); + + Logger.Log(LogLevel.Trace, "Log Trace"); + Logger.Log(LogLevel.Debug, "Log Debug"); + Logger.Log(LogLevel.Info, "Log Info"); + Logger.Log(LogLevel.Warn, "Log Warn"); + Logger.Log(LogLevel.Error, "Log Error"); + Logger.Log(LogLevel.Fatal, "Log Fatal"); var thread = new Thread(() => { diff --git a/TestApplication/nlog.config b/TestApplication/nlog.config index ebe436e..592ec4a 100644 --- a/TestApplication/nlog.config +++ b/TestApplication/nlog.config @@ -13,7 +13,7 @@ layout="${message}" autoScroll="true" - maxLines="10" + maxLines="30" useDefaultRowColoringRules="true" /> @@ -24,7 +24,7 @@ formName="Form1" ControlName="richTextBox1" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" @@ -40,7 +40,7 @@ formName="Form1" ControlName="richTextBox2" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" @@ -65,7 +65,7 @@ - + \ No newline at end of file diff --git a/TestApplicationCore3/Form1.cs b/TestApplicationCore3/Form1.cs index 0e15cfe..b7477dd 100644 --- a/TestApplicationCore3/Form1.cs +++ b/TestApplicationCore3/Form1.cs @@ -18,6 +18,13 @@ public Form1() RichTextBoxTarget.ReInitializeAllTextboxes(this); + Logger.Log(LogLevel.Trace, "Log Trace"); + Logger.Log(LogLevel.Debug, "Log Debug"); + Logger.Log(LogLevel.Info, "Log Info"); + Logger.Log(LogLevel.Warn, "Log Warn"); + Logger.Log(LogLevel.Error, "Log Error"); + Logger.Log(LogLevel.Fatal, "Log Fatal"); + var thread = new Thread(() => { Random rnd = new Random(); diff --git a/TestApplicationCore3/nlog.config b/TestApplicationCore3/nlog.config index 0a08c46..3e8da5c 100644 --- a/TestApplicationCore3/nlog.config +++ b/TestApplicationCore3/nlog.config @@ -13,7 +13,7 @@ layout="${message}" autoScroll="true" - maxLines="10" + maxLines="30" useDefaultRowColoringRules="true" /> @@ -24,7 +24,7 @@ formName="Form1" ControlName="richTextBox1" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" @@ -39,7 +39,7 @@ formName="Form1" ControlName="richTextBox2" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" diff --git a/TestApplicationNet5/Form1.cs b/TestApplicationNet5/Form1.cs index 9241b56..e827013 100644 --- a/TestApplicationNet5/Form1.cs +++ b/TestApplicationNet5/Form1.cs @@ -18,6 +18,13 @@ public Form1() RichTextBoxTarget.ReInitializeAllTextboxes(this); + Logger.Log(LogLevel.Trace, "Log Trace"); + Logger.Log(LogLevel.Debug, "Log Debug"); + Logger.Log(LogLevel.Info, "Log Info"); + Logger.Log(LogLevel.Warn, "Log Warn"); + Logger.Log(LogLevel.Error, "Log Error"); + Logger.Log(LogLevel.Fatal, "Log Fatal"); + var thread = new Thread(() => { Random rnd = new Random(); diff --git a/TestApplicationNet5/nlog.config b/TestApplicationNet5/nlog.config index ebe436e..edd50bf 100644 --- a/TestApplicationNet5/nlog.config +++ b/TestApplicationNet5/nlog.config @@ -13,7 +13,7 @@ layout="${message}" autoScroll="true" - maxLines="10" + maxLines="30" useDefaultRowColoringRules="true" /> @@ -24,7 +24,7 @@ formName="Form1" ControlName="richTextBox1" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" @@ -40,7 +40,7 @@ formName="Form1" ControlName="richTextBox2" autoScroll="true" - maxLines="20" + maxLines="30" allowAccessoryFormCreation="false" messageRetention="OnlyMissed" From a80495052f32ccdb68bcfad8d45b788de38d1578 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 30 Dec 2020 23:14:37 +0100 Subject: [PATCH 12/26] test all platforms --- .../NLog.Windows.Forms.Tests.csproj | 3 +-- .../RichTextBoxTargetTests.cs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj index 3ec5037..ea3bdac 100644 --- a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj +++ b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj @@ -1,12 +1,11 @@  - net452 + net452;netcoreapp3.0;net5.0-windows ..\ NLog.Windows.Forms.Tests Microsoft NLog.Windows.Forms.Tests Copyright © Jaroslaw Kowalski, Kim Christensen, Julian Verdurmen 2015-2016 - bin\$(Configuration)\ full diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index cef1ebe..ed62d26 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -1165,9 +1165,13 @@ public void LinkClickTest() bool linkClickedFromHandler = false; string linkTextFromHandler = null; LogEventInfo logEventFromHandler = null; + var cancellationTokenSource = new CancellationTokenSource(); + var cancellationToken = cancellationTokenSource.Token; + RichTextBoxTarget.DelLinkClicked clickHandler = (RichTextBoxTarget sender, string linkText, LogEventInfo logEvent) => { + cancellationTokenSource.Cancel(); //actual checks moved to main code to make exceptions caught by the test runner. linkClickedFromHandler = true; linkTextFromHandler = linkText; @@ -1177,6 +1181,16 @@ public void LinkClickTest() RichTextBoxTarget.GetTargetByControl(target.TargetRichTextBox).LinkClicked += clickHandler; + Task.Run(() => + { + // max wait time. After that. Stop + int timeout = 1_000; + Thread.Sleep(timeout); + target.TargetForm.Close(); + throw new TimeoutException("Waited to long for click"); + + }, cancellationToken); + //simulate clicking on a link Task.Run(() => { @@ -1190,7 +1204,7 @@ public void LinkClickTest() } }); - //in case link does not click, this would hang up infinitely; + Application.Run(target.TargetForm); Assert.True(linkClickedFromHandler); //check that we have actually clicked on a link, not just missed anything From 4866d629f66d2a8fb14ab6155d738c085a03ac75 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Thu, 31 Dec 2020 01:27:01 +0100 Subject: [PATCH 13/26] update testscript --- appveyor.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index c625e1f..f5e83a6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,9 +15,10 @@ skip_tags: true build_script: - ps: msbuild /t:restore,build /p:Configuration=Release /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /maxcpucount /v:m test_script: - - nuget.exe install OpenCover -ExcludeVersion - - OpenCover\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"\"c:\projects\nlog\NLog.Windows.Forms.Tests\bin\Release\net452\NLog.Windows.Forms.Tests.dll\" -appveyor -noshadow" -returntargetcode -filter:"+[NLog.Windows.Forms]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -output:coverage.xml - - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" + - nuget.exe install OpenCover -ExcludeVersion -DependencyVersion Ignore + - OpenCover\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"\"c:\projects\nlog\NLog.Windows.Forms.Tests\bin\Release\net452\NLog.Windows.Forms.Tests.dll\" -appveyor -noshadow" -returntargetcode -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -output:coverage.xml + - OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.0 -c debug NLog.Windows.Forms.Tests" -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"NLog.Windows.Forms.Tests" + - OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f net5.0 -c debug NLog.Windows.Forms.Tests" -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"NLog.Windows.Forms.Tests" - pip install codecov - codecov -f "coverage.xml" From ee8fe260759a8bf72ae35b6c9607af44608c9746 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Thu, 31 Dec 2020 01:33:49 +0100 Subject: [PATCH 14/26] fix MaxLinesTest --- NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index ed62d26..97c6008 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -299,7 +299,6 @@ public void MaxLinesTest() { ControlName = "Control1", Layout = "${message}", - ShowMinimized = true, ToolWindow = false, AutoScroll = true, }; From bb043c210bf16b35ec4e64055fe9d8592ebfc808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20K=C3=A4s?= Date: Thu, 31 Dec 2020 02:11:59 +0100 Subject: [PATCH 15/26] unit tests are written with a very specific font in mind --- NLog.Windows.Forms/FormHelper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NLog.Windows.Forms/FormHelper.cs b/NLog.Windows.Forms/FormHelper.cs index 6e149e0..d4dbd58 100644 --- a/NLog.Windows.Forms/FormHelper.cs +++ b/NLog.Windows.Forms/FormHelper.cs @@ -108,7 +108,8 @@ internal static Form CreateForm(string name, int width, int height, bool show, b { Name = name, Text = "NLog", - Icon = GetNLogIcon() + Icon = GetNLogIcon(), + Font = new Font("Microsoft Sans Serif", 7.5f, FontStyle.Regular, GraphicsUnit.Point, 0), }; #if !Smartphone From 33672d35a6fba6f7e89a809adc66710e179ed58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20K=C3=A4s?= Date: Thu, 31 Dec 2020 02:12:28 +0100 Subject: [PATCH 16/26] there can be whitespace after viewkind markup --- .../RichTextBoxTargetTests.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index 97c6008..f2977a3 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -57,11 +57,13 @@ public void SimpleRichTextBoxTargetTest() if (IsAppVeyor()) { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\b\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\b\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } else { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\b\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\b\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } Assert.Contains(@"\cf2\highlight1\i Error NLog.UnitTests.Targets.RichTextBoxTargetTests Foo\par", result); @@ -179,11 +181,13 @@ private static void AssertViewkind(string result) { if (IsAppVeyor()) { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } else { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } } @@ -228,11 +232,13 @@ public void CustomWordRowColoringTest() if (IsAppVeyor()) { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs17 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); } else { - Assert.Contains(@"\viewkind4\uc1\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); } Assert.Contains(@"Error NLog.UnitTests.Targets.RichTextBoxTargetTests Foo xxx\par", result); From cb8d24ed3bae5f7bfc70226feeaf976110ac9e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20K=C3=A4s?= Date: Thu, 31 Dec 2020 03:11:08 +0100 Subject: [PATCH 17/26] skip testing unsupported scenarios --- .../RichTextBoxTargetTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index f2977a3..69a3bcd 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -1034,7 +1034,11 @@ public void LinkLayoutTestDisabledLinks() Assert.Matches(@"(\([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\))", result); //the placeholder GUID was not replaced by was not replaced because of SupportLinks set to false } +#if NETCOREAPP3_0 || NETCOREAPP3_1 + [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] +#else [Fact] +#endif public void LinkTest() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1062,7 +1066,11 @@ public void LinkTest() Assert.Contains(@"descr\v #link", resultRtf); //RTF contains everything } +#if NETCOREAPP3_0 || NETCOREAPP3_1 + [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] +#else [Fact] +#endif public void LinkTestConditional() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1110,7 +1118,11 @@ public void LinkTestConditional() } } +#if NETCOREAPP3_0 || NETCOREAPP3_1 + [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] +#else [Fact] +#endif public void LinkTestExcessLinksRemoved() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1145,7 +1157,11 @@ public void LinkTestExcessLinksRemoved() Assert.True(target.LinkedEventsCount == target.MaxLines); //storing 5, not 100 events } +#if NETCOREAPP + [Fact(Skip = ".NET Core does not pass hidden text to LinkClicked handlers")] +#else [Fact] +#endif public void LinkClickTest() { RichTextBoxTarget target = new RichTextBoxTarget() From 39a0c9ece752d4c26577e2c0bb460530be106c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20K=C3=A4s?= Date: Thu, 31 Dec 2020 03:02:57 +0100 Subject: [PATCH 18/26] do not hardcode the font, instead hardcode test results --- .../RichTextBoxTargetTests.cs | 31 +++++++++++++++++++ NLog.Windows.Forms/FormHelper.cs | 1 - 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index 69a3bcd..b302382 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -55,6 +55,10 @@ public void SimpleRichTextBoxTargetTest() var result = rtfText; Assert.Contains(@"{\colortbl ;\red255\green255\blue255;\red255\green0\blue0;\red255\green165\blue0;\red0\green0\blue0;\red128\green128\blue128;\red169\green169\blue169;}", result); +#if NETCOREAPP + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\b\f0\fs18 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); +#else if (IsAppVeyor()) { Assert.Contains(@"\viewkind4\uc1", result); @@ -65,13 +69,18 @@ public void SimpleRichTextBoxTargetTest() Assert.Contains(@"\viewkind4\uc1", result); Assert.Contains(@"\pard\cf1\highlight2\b\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } +#endif Assert.Contains(@"\cf2\highlight1\i Error NLog.UnitTests.Targets.RichTextBoxTargetTests Foo\par", result); Assert.Contains(@"\cf3\ul\b0\i0 Warn NLog.UnitTests.Targets.RichTextBoxTargetTests Bar\par", result); Assert.Contains(@"\cf4\ulnone Info NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); Assert.Contains(@"\cf5 Debug NLog.UnitTests.Targets.RichTextBoxTargetTests Foo\par", result); Assert.Contains(@"\cf6\i Trace NLog.UnitTests.Targets.RichTextBoxTargetTests Bar\par", result); +#if NETCOREAPP + Assert.Contains(@"\cf0\highlight0\i0\par", result); +#else Assert.Contains(@"\cf0\highlight0\i0\f1\par", result); +#endif Assert.Contains(@"}", result); LogManager.Configuration = null; @@ -117,7 +126,11 @@ public void NoColoringTest() Assert.Contains(@"Info NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); Assert.Contains(@"Debug NLog.UnitTests.Targets.RichTextBoxTargetTests Foo\par", result); Assert.Contains(@"Trace NLog.UnitTests.Targets.RichTextBoxTargetTests Bar\par", result); +#if NETCOREAPP + Assert.Contains(@"\cf0\highlight0\par", result); +#else Assert.Contains(@"\cf0\highlight0\f1\par", result); +#endif Assert.Contains(@"}", result); } finally @@ -168,7 +181,11 @@ public void CustomRowColoringTest() Assert.Contains(@"\cf1 Info NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); Assert.Contains(@"Debug NLog.UnitTests.Targets.RichTextBoxTargetTests Foo\par", result); Assert.Contains(@"\cf3 Trace NLog.UnitTests.Targets.RichTextBoxTargetTests Bar\par", result); +#if NETCOREAPP + Assert.Contains(@"\cf0\highlight0\par", result); +#else Assert.Contains(@"\cf0\highlight0\f1\par", result); +#endif Assert.Contains(@"}", result); } finally @@ -179,6 +196,10 @@ public void CustomRowColoringTest() private static void AssertViewkind(string result) { +#if NETCOREAPP + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs18 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); +#else if (IsAppVeyor()) { Assert.Contains(@"\viewkind4\uc1", result); @@ -189,6 +210,7 @@ private static void AssertViewkind(string result) Assert.Contains(@"\viewkind4\uc1", result); Assert.Contains(@"\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test\par", result); } +#endif } [Fact] @@ -230,6 +252,10 @@ public void CustomWordRowColoringTest() var result = rtfText; Assert.Contains(@"{\colortbl ;\red0\green0\blue0;\red255\green255\blue255;\red255\green0\blue0;\red0\green128\blue0;}", result); +#if NETCOREAPP + Assert.Contains(@"\viewkind4\uc1", result); + Assert.Contains(@"\pard\cf1\highlight2\f0\fs18 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); +#else if (IsAppVeyor()) { Assert.Contains(@"\viewkind4\uc1", result); @@ -240,13 +266,18 @@ public void CustomWordRowColoringTest() Assert.Contains(@"\viewkind4\uc1", result); Assert.Contains(@"\pard\cf1\highlight2\f0\fs15 Fatal NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf3\f1 zzz\cf1\f0\par", result); } +#endif Assert.Contains(@"Error NLog.UnitTests.Targets.RichTextBoxTargetTests Foo xxx\par", result); Assert.Contains(@"Warn NLog.UnitTests.Targets.RichTextBoxTargetTests Bar yyy\par", result); Assert.Contains(@"Info NLog.UnitTests.Targets.RichTextBoxTargetTests Test \cf4\f1 aaa\cf1\f0\par", result); Assert.Contains(@"Debug NLog.UnitTests.Targets.RichTextBoxTargetTests Foo \cf3\f1 zzz\cf1\f0\par", result); Assert.Contains(@"Trace NLog.UnitTests.Targets.RichTextBoxTargetTests Bar ccc\par", result); +#if NETCOREAPP + Assert.Contains(@"\cf0\highlight0\par", result); +#else Assert.Contains(@"\cf0\highlight0\f1\par", result); +#endif Assert.Contains(@"}", result); } finally diff --git a/NLog.Windows.Forms/FormHelper.cs b/NLog.Windows.Forms/FormHelper.cs index d4dbd58..7ef5788 100644 --- a/NLog.Windows.Forms/FormHelper.cs +++ b/NLog.Windows.Forms/FormHelper.cs @@ -109,7 +109,6 @@ internal static Form CreateForm(string name, int width, int height, bool show, b Name = name, Text = "NLog", Icon = GetNLogIcon(), - Font = new Font("Microsoft Sans Serif", 7.5f, FontStyle.Regular, GraphicsUnit.Point, 0), }; #if !Smartphone From cc394635ade00129fca4a2979d69dda348a4eeb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20K=C3=A4s?= Date: Thu, 31 Dec 2020 12:07:31 +0100 Subject: [PATCH 19/26] use hyperlink markup instead of hidden text for links --- .../RichTextBoxTargetTests.cs | 27 +++++++++++++++---- NLog.Windows.Forms/FormHelper.cs | 4 +++ NLog.Windows.Forms/RichTextBoxTarget.cs | 4 +++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index b302382..7a81afa 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -1066,7 +1066,7 @@ public void LinkLayoutTestDisabledLinks() } #if NETCOREAPP3_0 || NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] + [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] #endif @@ -1094,11 +1094,15 @@ public void LinkTest() string resultText = target.TargetRichTextBox.Text; Assert.DoesNotMatch(@"(\([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\))", resultRtf); //the placeholder GUID was replaced Assert.Contains("descr#link", resultText); //text contains visible and invisible parts +#if NETCOREAPP + Assert.Contains(@"{\field{\*\fldinst{HYPERLINK ""descr#link", resultRtf); //RTF contains everything +#else Assert.Contains(@"descr\v #link", resultRtf); //RTF contains everything +#endif } #if NETCOREAPP3_0 || NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] + [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] #endif @@ -1128,7 +1132,11 @@ public void LinkTestConditional() string resultRtf = ExtractRtf(target.TargetRichTextBox); Assert.Contains("TestNoLink", resultText); Assert.DoesNotContain("#link", resultText); //no link for first event +#if NETCOREAPP + Assert.DoesNotContain(@"{\field{\*\fldinst{HYPERLINK", resultRtf); //no link for first event +#else Assert.DoesNotContain(@"\v #link", resultRtf); //no link for first event +#endif } @@ -1144,13 +1152,18 @@ public void LinkTestConditional() { string resultText = target.TargetRichTextBox.Text; string resultRtf = ExtractRtf(target.TargetRichTextBox); +#if NETCOREAPP + Assert.Contains("TestWithLink HYPERLINK \"marker_text#link", resultText); //link for a second event + Assert.Contains(@"TestWithLink {{\field{\*\fldinst{HYPERLINK ""marker_text#link", resultRtf); //link for a second event +#else Assert.Contains("TestWithLink marker_text#link", resultText); //link for a second event Assert.Contains(@"marker_text\v #link", resultRtf); //link for a second event +#endif } } #if NETCOREAPP3_0 || NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links based on hidden text")] + [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] #endif @@ -1183,13 +1196,17 @@ public void LinkTestExcessLinksRemoved() string resultText = target.TargetRichTextBox.Text; string resultRtf = ExtractRtf(target.TargetRichTextBox); Assert.Contains("#link", resultText); //some links exist +#if NETCOREAPP + Assert.Contains(@"{\field{\*\fldinst{HYPERLINK", resultRtf); //some links exist +#else Assert.Contains(@"\v #link", resultRtf); //some links exist +#endif Assert.True(target.LinkedEventsCount == target.MaxLines); //storing 5, not 100 events } -#if NETCOREAPP - [Fact(Skip = ".NET Core does not pass hidden text to LinkClicked handlers")] +#if NETCOREAPP3_0 || NETCOREAPP3_1 + [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] #endif diff --git a/NLog.Windows.Forms/FormHelper.cs b/NLog.Windows.Forms/FormHelper.cs index 7ef5788..8c00680 100644 --- a/NLog.Windows.Forms/FormHelper.cs +++ b/NLog.Windows.Forms/FormHelper.cs @@ -163,6 +163,9 @@ private static Icon GetNLogIcon() /// internal static void ChangeSelectionToLink(RichTextBox textBox, string text, string hyperlink) { +#if NETCOREAPP + textBox.SelectedRtf = @"{\rtf1\ansi{\field{\*\fldinst{HYPERLINK """ + text + @"#" + hyperlink + @""" }}{\fldrslt{" + text + @"}}}}"; +#else int selectionStart = textBox.SelectionStart; //using \v tag to hide hyperlink part of the text, and \v0 to end hiding. See http://stackoverflow.com/a/14339531/376066 @@ -171,6 +174,7 @@ internal static void ChangeSelectionToLink(RichTextBox textBox, string text, str textBox.Select(selectionStart, text.Length + 1 + hyperlink.Length); //now select both visible and invisible part SetSelectionStyle(textBox, CFM_LINK, CFE_LINK); //and turn into a link +#endif } /// diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index 811ac54..752dbfe 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -327,7 +327,11 @@ public bool SupportLinks if (linkAddRegex == null) { linkAddRegex = new Regex(@"(\([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\))", RegexOptions.Compiled); +#if NETCOREAPP + linkRemoveRtfRegex = new Regex(@"\{\\field\{\\\*\\fldinst\{HYPERLINK ""[^""]*\#" + LinkPrefix + @"(\d+)"" \}\}", RegexOptions.Compiled); +#else linkRemoveRtfRegex = new Regex(@"\\v #" + LinkPrefix + @"(\d+)\\v0", RegexOptions.Compiled); +#endif } } lock (linkedEventsLock) From dba2c0b68f0577336d844cd09365bb3cccb99582 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 21:41:42 +0200 Subject: [PATCH 20/26] move to .NET Core 3.1 --- NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj | 2 +- NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs | 8 ++++---- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 2 +- TestApplicationCore3/TestApplicationCore3.csproj | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj index ea3bdac..6266c81 100644 --- a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj +++ b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj @@ -1,6 +1,6 @@  - net452;netcoreapp3.0;net5.0-windows + net452;netcoreapp3.1;net5.0-windows ..\ NLog.Windows.Forms.Tests Microsoft diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index 7a81afa..0fb7cb0 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -1065,7 +1065,7 @@ public void LinkLayoutTestDisabledLinks() Assert.Matches(@"(\([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\))", result); //the placeholder GUID was not replaced by was not replaced because of SupportLinks set to false } -#if NETCOREAPP3_0 || NETCOREAPP3_1 +#if NETCOREAPP3_1 [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] @@ -1101,7 +1101,7 @@ public void LinkTest() #endif } -#if NETCOREAPP3_0 || NETCOREAPP3_1 +#if NETCOREAPP3_1 [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] @@ -1162,7 +1162,7 @@ public void LinkTestConditional() } } -#if NETCOREAPP3_0 || NETCOREAPP3_1 +#if NETCOREAPP3_1 [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] @@ -1205,7 +1205,7 @@ public void LinkTestExcessLinksRemoved() Assert.True(target.LinkedEventsCount == target.MaxLines); //storing 5, not 100 events } -#if NETCOREAPP3_0 || NETCOREAPP3_1 +#if NETCOREAPP3_1 [Fact(Skip = ".NET Core 3.x does not support links")] #else [Fact] diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index 74fd7d5..529d391 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -1,6 +1,6 @@  - net35;netcoreapp3.0;net5.0-windows + net35;netcoreapp3.1;net5.0-windows NLog.Windows.Forms NLog NLog.Windows.Forms diff --git a/TestApplicationCore3/TestApplicationCore3.csproj b/TestApplicationCore3/TestApplicationCore3.csproj index d99983b..7fa5f66 100644 --- a/TestApplicationCore3/TestApplicationCore3.csproj +++ b/TestApplicationCore3/TestApplicationCore3.csproj @@ -2,7 +2,7 @@ WinExe - netcoreapp3.0 + netcoreapp3.1 true From c5f261e6d9e4d5505a2f8e9be87905d743496a10 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 22:13:39 +0200 Subject: [PATCH 21/26] Disable SupportLinks for .NET Core 3.x --- .../NLog.Windows.Forms.Tests.csproj | 6 ++++- .../RichTextBoxTargetTests.cs | 21 ++++----------- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 6 +++++ .../RichTextBoxLinkLayoutRenderer .cs | 3 +++ NLog.Windows.Forms/RichTextBoxTarget.cs | 27 +++++++++++++++++-- TestApplicationCore3/nlog.config | 4 +-- 6 files changed, 46 insertions(+), 21 deletions(-) diff --git a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj index 6266c81..46330af 100644 --- a/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj +++ b/NLog.Windows.Forms.Tests/NLog.Windows.Forms.Tests.csproj @@ -5,7 +5,7 @@ NLog.Windows.Forms.Tests Microsoft NLog.Windows.Forms.Tests - Copyright © Jaroslaw Kowalski, Kim Christensen, Julian Verdurmen 2015-2016 + Copyright © Jaroslaw Kowalski, Kim Christensen, Julian Verdurmen full @@ -19,6 +19,10 @@ NLog.snk + + + $(DefineConstants);LINKS_SUPPORTED + diff --git a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs index 0fb7cb0..93a926a 100644 --- a/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs +++ b/NLog.Windows.Forms.Tests/RichTextBoxTargetTests.cs @@ -1042,6 +1042,8 @@ public void ManualRegisterTestWithRetentionConfigReload() } } +#if LINKS_SUPPORTED + [Fact] public void LinkLayoutTestDisabledLinks() { @@ -1065,11 +1067,8 @@ public void LinkLayoutTestDisabledLinks() Assert.Matches(@"(\([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\))", result); //the placeholder GUID was not replaced by was not replaced because of SupportLinks set to false } -#if NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links")] -#else + [Fact] -#endif public void LinkTest() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1101,11 +1100,8 @@ public void LinkTest() #endif } -#if NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links")] -#else + [Fact] -#endif public void LinkTestConditional() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1162,11 +1158,7 @@ public void LinkTestConditional() } } -#if NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links")] -#else [Fact] -#endif public void LinkTestExcessLinksRemoved() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1205,11 +1197,7 @@ public void LinkTestExcessLinksRemoved() Assert.True(target.LinkedEventsCount == target.MaxLines); //storing 5, not 100 events } -#if NETCOREAPP3_1 - [Fact(Skip = ".NET Core 3.x does not support links")] -#else [Fact] -#endif public void LinkClickTest() { RichTextBoxTarget target = new RichTextBoxTarget() @@ -1280,6 +1268,7 @@ public void LinkClickTest() Assert.True("link" == linkTextFromHandler); Assert.True("Test" == logEventFromHandler.Message); } +#endif #region mouse click smulation diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index 574f9ae..e058659 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -30,6 +30,12 @@ + + + + $(DefineConstants);LINKS_SUPPORTED + + diff --git a/NLog.Windows.Forms/RichTextBoxLinkLayoutRenderer .cs b/NLog.Windows.Forms/RichTextBoxLinkLayoutRenderer .cs index 53d2f09..6133eba 100644 --- a/NLog.Windows.Forms/RichTextBoxLinkLayoutRenderer .cs +++ b/NLog.Windows.Forms/RichTextBoxLinkLayoutRenderer .cs @@ -9,6 +9,8 @@ namespace NLog.Windows.Forms { +#if LINKS_SUPPORTED + /// /// Strings rendered with this rendrer would convert to links in the control. /// @@ -92,4 +94,5 @@ internal string GetValue(string guid) } } } +#endif } diff --git a/NLog.Windows.Forms/RichTextBoxTarget.cs b/NLog.Windows.Forms/RichTextBoxTarget.cs index 1b9e616..625df3c 100644 --- a/NLog.Windows.Forms/RichTextBoxTarget.cs +++ b/NLog.Windows.Forms/RichTextBoxTarget.cs @@ -363,6 +363,9 @@ public RichTextBoxTargetMessageRetentionStrategy MessageRetention /// private volatile Queue messageQueue; + +#if LINKS_SUPPORTED + /// /// If set to true, using "rtb-link" renderer () would create clickable links in the control. /// @@ -400,6 +403,8 @@ public bool SupportLinks } } +#endif +#if LINKS_SUPPORTED /// /// Type of delegate for event. /// @@ -413,7 +418,7 @@ public bool SupportLinks /// /// public event DelLinkClicked LinkClicked; - + /// /// Actual value of the property /// @@ -429,6 +434,7 @@ public bool SupportLinks /// private Dictionary linkedEvents; + /// /// Returns number of events stored for active links in the control. /// Used only in tests to check that non needed events are removed. @@ -448,6 +454,8 @@ internal int? LinkedEventsCount } } + + /// /// Internal prefix that is added to the link id in RTF /// @@ -469,7 +477,7 @@ internal int? LinkedEventsCount /// Lazily initialized in .set(true). Assure checking before accessing the field /// private static Regex linkRemoveRtfRegex; - +#endif /// /// Initializes the target. Can be used by inheriting classes @@ -602,12 +610,16 @@ private void AttachToControl(Form form, RichTextBox textboxControl) this.TargetForm = form; this.TargetRichTextBox = textboxControl; +#if LINKS_SUPPORTED + if (this.SupportLinks) { this.TargetRichTextBox.DetectUrls = false; this.TargetRichTextBox.LinkClicked += TargetRichTextBox_LinkClicked; } +#endif + //OnReattach? switch (messageRetention) { @@ -641,6 +653,8 @@ private void AttachToControl(Form form, RichTextBox textboxControl) } } +#if LINKS_SUPPORTED + /// /// Attached to RTB-control's LinkClicked event to convert link text to logEvent /// @@ -683,6 +697,8 @@ private void TargetRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e } } +#endif + /// /// if is true, then destroys created form. Resets , and to default values /// @@ -885,6 +901,8 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori } } +#if LINKS_SUPPORTED + if (SupportLinks) { object linkInfoObj; @@ -921,6 +939,9 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori } } +#endif + + //remove some lines if there above the max if (MaxLines > 0) { @@ -935,6 +956,7 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori { textBox.SelectionStart = 0; textBox.SelectionLength = textBox.GetFirstCharIndexFromLine(tooManyLines); +#if LINKS_SUPPORTED if (SupportLinks) { string selectedRtf = textBox.SelectedRtf; @@ -951,6 +973,7 @@ private void SendTheMessageToRichTextBox(string logMessage, RichTextBoxRowColori } } } +#endif textBox.SelectedRtf = "{\\rtf1\\ansi}"; } } diff --git a/TestApplicationCore3/nlog.config b/TestApplicationCore3/nlog.config index 3e8da5c..b304652 100644 --- a/TestApplicationCore3/nlog.config +++ b/TestApplicationCore3/nlog.config @@ -19,7 +19,7 @@ Date: Mon, 29 Mar 2021 22:17:18 +0200 Subject: [PATCH 22/26] 3.1 appveyor --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index fd06606..0f894a2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,7 +9,7 @@ build_script: test_script: - nuget.exe install OpenCover -ExcludeVersion -DependencyVersion Ignore - OpenCover\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"\"c:\projects\nlog\NLog.Windows.Forms.Tests\bin\Release\net452\NLog.Windows.Forms.Tests.dll\" -appveyor -noshadow" -returntargetcode -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -output:coverage.xml - - OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.0 -c debug NLog.Windows.Forms.Tests" -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"NLog.Windows.Forms.Tests" + - OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f netcoreapp3.1 -c debug NLog.Windows.Forms.Tests" -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"NLog.Windows.Forms.Tests" - OpenCover\tools\OpenCover.Console.exe -register:user -mergeoutput -target:"C:/Program Files/dotnet/dotnet.exe" -targetargs:"test -f net5.0 -c debug NLog.Windows.Forms.Tests" -filter:"+[NLog.Windows.Forms]* -[NLog.Windows.Forms.Tests]*" -output:"coverage.xml" -oldstyle -targetdir:"NLog.Windows.Forms.Tests" - pip install codecov - codecov -f "coverage.xml" From 9294a99c6fc24a7222eba1b239e5697badfe6d86 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 22:19:06 +0200 Subject: [PATCH 23/26] Fix csproj --- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index e058659..ecda862 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -5,8 +5,8 @@ NLog NLog.Windows.Forms Extend NLog with targets for Windows Forms applications. For example: writing to a richtextbox or raising alert popups. - Copyright 2014-2020 - 4.4-beta1 + $([System.DateTime]::Now.ToString(yyyy)) + Copyright (c) 2014-$(CurrentYear) NLog Project - https://nlog-project.org/ true NLog N.png @@ -15,7 +15,6 @@ nlog target forms windows richtextbox true true - snupkg Full true true From 4252458d834f944fe9c002eb7b3c1f71148628ac Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 22:22:09 +0200 Subject: [PATCH 24/26] sln folder --- NLog.Windows.Forms.sln | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NLog.Windows.Forms.sln b/NLog.Windows.Forms.sln index 9eb5225..3430edc 100644 --- a/NLog.Windows.Forms.sln +++ b/NLog.Windows.Forms.sln @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplicationCore3", "Tes EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplicationNet5", "TestApplicationNet5\TestApplicationNet5.csproj", "{134980CC-0226-42B1-B02F-A9C81AAB0A3D}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test Applications", "Test Applications", "{6AB4C95A-36D8-4F52-8F25-EF9CA98AF536}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,6 +45,11 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {03D9D89A-B972-4446-AB4A-A430851243D0} = {6AB4C95A-36D8-4F52-8F25-EF9CA98AF536} + {9FAC81DA-0137-47E9-957A-D8A9A5215338} = {6AB4C95A-36D8-4F52-8F25-EF9CA98AF536} + {134980CC-0226-42B1-B02F-A9C81AAB0A3D} = {6AB4C95A-36D8-4F52-8F25-EF9CA98AF536} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2DC4C500-52F1-4D06-863D-209D713D03ED} EndGlobalSection From 529c3d639c9c8b7289233e1842158da2f4902f61 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 22:25:57 +0200 Subject: [PATCH 25/26] Version 4.5-rc.1 --- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 2 +- appveyor.yml | 2 +- build.ps1 | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index ecda862..a85bd2a 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -26,7 +26,7 @@ 4.0.0.0 - +Added support for .NET Core 3.1 and .NET 5 (#42) (@weltkante, @304NotModified) diff --git a/appveyor.yml b/appveyor.yml index 0f894a2..4a362fc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.4.0.{build} +version: 4.5.0.{build} image: Visual Studio 2019 clone_folder: c:\projects\nlog configuration: Release diff --git a/build.ps1 b/build.ps1 index 1b50f77..ef9540e 100644 --- a/build.ps1 +++ b/build.ps1 @@ -2,8 +2,8 @@ # creates NuGet package at \artifacts dotnet --version -$versionPrefix = "4.4.0" # Also update version for minor versions in appveyor.yml -$versionSuffix = "" +$versionPrefix = "4.5.0" # Also update version for minor versions in appveyor.yml +$versionSuffix = "rc.1" $versionFile = $versionPrefix + "." + ${env:APPVEYOR_BUILD_NUMBER} if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { $versionPrefix = $versionFile From ff6e8ac8f7332dbb77ca57e0316b343baeb2994f Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Mon, 29 Mar 2021 22:35:07 +0200 Subject: [PATCH 26/26] fix csproj #2 --- NLog.Windows.Forms/NLog.Windows.Forms.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/NLog.Windows.Forms/NLog.Windows.Forms.csproj b/NLog.Windows.Forms/NLog.Windows.Forms.csproj index a85bd2a..489fb70 100644 --- a/NLog.Windows.Forms/NLog.Windows.Forms.csproj +++ b/NLog.Windows.Forms/NLog.Windows.Forms.csproj @@ -37,6 +37,7 @@ Added support for .NET Core 3.1 and .NET 5 (#42) (@weltkante, @304NotModified) +