[1.6.1] ProgrammLogger Fixed

This commit is contained in:
BlubbFish 2022-01-20 19:42:14 +01:00
parent 61f26e69af
commit e3d37988c9
3 changed files with 192 additions and 168 deletions

View File

@ -1,5 +1,11 @@
# Changelog
## 1.6.1 - 2022-01-20 - ProgrammLogger Fixed
### New Features
### Bugfixes
* Unhandled exception. System.IO.IOException: The file '/var/log/zwaybot/debug.log' already exists.
### Changes
## 1.6.0 - 2022-01-09 - HttpEndpoint added
### New Features
* Add HttpEndpoint

View File

@ -1,150 +1,167 @@
using System;
using System.IO;
using System.Text;
namespace BlubbFish.Utils {
public class ProgramLogger {
private FileWriter fw;
private ConsoleWriter stdout;
private ConsoleWriter errout;
private String loggerfile;
public ProgramLogger() {
this.loggerfile = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "output.log";
this.Init(this.loggerfile);
this.AttachToFw();
this.SetOutputs();
}
private void SetOutputs() {
Console.SetOut(this.stdout);
Console.SetError(this.errout);
}
private void Init(String file) {
if(!this.IsWritable(file)) {
Console.Error.WriteLine("Cannot write to " + file);
throw new ArgumentException("Cannot write to " + file);
}
this.fw = new FileWriter(file);
this.stdout = new ConsoleWriter(Console.Out, ConsoleWriterEventArgs.ConsoleType.Info);
this.errout = new ConsoleWriter(Console.Error, ConsoleWriterEventArgs.ConsoleType.Error);
}
private Boolean IsWritable(String filename) {
try {
using System;
using System.IO;
using System.Text;
namespace BlubbFish.Utils {
public class ProgramLogger {
private FileWriter fw;
private ConsoleWriter stdout;
private ConsoleWriter errout;
private String loggerfile;
public ProgramLogger() {
this.loggerfile = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "output.log";
this.Init(this.loggerfile);
this.AttachToFw();
this.SetOutputs();
}
private void SetOutputs() {
Console.SetOut(this.stdout);
Console.SetError(this.errout);
}
private void Init(String file) {
if(!this.IsWritable(file)) {
Console.Error.WriteLine("Cannot write to " + file);
throw new ArgumentException("Cannot write to " + file);
}
this.fw = new FileWriter(file, false);
this.stdout = new ConsoleWriter(Console.Out, ConsoleWriterEventArgs.ConsoleType.Info);
this.errout = new ConsoleWriter(Console.Error, ConsoleWriterEventArgs.ConsoleType.Error);
}
private Boolean IsWritable(String filename) {
try {
using FileStream fstream = new FileStream(filename, FileMode.Append);
using TextWriter writer = new StreamWriter(fstream);
writer.Write("");
} catch (UnauthorizedAccessException) {
return false;
}
return true;
}
public void SetPath(String file) {
if(file == null) {
return;
}
if (!this.IsWritable(file)) {
Console.Error.WriteLine("Cannot write to " + file);
throw new ArgumentException("Cannot write to " + file);
}
this.DisattachToFw();
this.fw.Close();
if(new FileInfo(this.loggerfile).Length > 0) {
File.Move(this.loggerfile, file);
} else {
File.Delete(this.loggerfile);
}
this.loggerfile = file;
this.fw = new FileWriter(this.loggerfile);
this.AttachToFw();
}
private void DisattachToFw() {
this.stdout.WriteEvent -= this.fw.Write;
this.stdout.WriteLineEvent -= this.fw.WriteLine;
this.errout.WriteEvent -= this.fw.Write;
this.errout.WriteLineEvent -= this.fw.WriteLine;
}
private void AttachToFw() {
this.stdout.WriteEvent += this.fw.Write;
this.stdout.WriteLineEvent += this.fw.WriteLine;
this.errout.WriteEvent += this.fw.Write;
this.errout.WriteLineEvent += this.fw.WriteLine;
}
}
internal class FileWriter : StreamWriter {
private Boolean newline = true;
public FileWriter(String path) : base(path) {
}
writer.Write("");
} catch (UnauthorizedAccessException) {
return false;
}
return true;
}
public void SetPath(String file) {
if(file == null) {
return;
}
if (!this.IsWritable(file)) {
Console.Error.WriteLine("Cannot write to " + file);
throw new ArgumentException("Cannot write to " + file);
}
this.DisattachToFw();
this.fw.Close();
if(new FileInfo(this.loggerfile).Length > 0) {
if(File.Exists(file)) {
this.FileCopy(this.loggerfile, file);
File.Delete(this.loggerfile);
} else {
File.Move(this.loggerfile, file);
}
} else {
File.Delete(this.loggerfile);
}
this.loggerfile = file;
this.fw = new FileWriter(this.loggerfile, true);
this.AttachToFw();
}
private void FileCopy(String source, String target) {
using FileStream fread = new FileStream(source, FileMode.Open);
using FileStream fwrite = new FileStream(target, FileMode.Create);
using TextReader reader = new StreamReader(fread);
using TextWriter writer = new StreamWriter(fwrite);
writer.Write(reader.ReadToEnd());
writer.Flush();
writer.Close();
reader.Close();
}
private void DisattachToFw() {
this.stdout.WriteEvent -= this.fw.Write;
this.stdout.WriteLineEvent -= this.fw.WriteLine;
this.errout.WriteEvent -= this.fw.Write;
this.errout.WriteLineEvent -= this.fw.WriteLine;
}
private void AttachToFw() {
this.stdout.WriteEvent += this.fw.Write;
this.stdout.WriteLineEvent += this.fw.WriteLine;
this.errout.WriteEvent += this.fw.Write;
this.errout.WriteLineEvent += this.fw.WriteLine;
}
}
internal class FileWriter : StreamWriter {
private Boolean newline = true;
public FileWriter(String path, Boolean append) : base(path, append) {
}
public override Encoding Encoding => Encoding.UTF8;
public override Boolean AutoFlush { get => true; set => base.AutoFlush = value; }
private void Write(String value, TextWriter origstream, ConsoleWriterEventArgs.ConsoleType type) {
public override Boolean AutoFlush { get => true; set => base.AutoFlush = value; }
private void Write(String value, TextWriter origstream, ConsoleWriterEventArgs.ConsoleType type) {
String text;
if (this.newline) {
text = "[" + DateTime.Now.ToString("o") + "]-" + type.ToString() + ": " + value;
this.newline = false;
} else {
text = value;
}
origstream.Write(text);
base.Write(text);
base.Flush();
}
private void WriteLine(String value, TextWriter origstream, ConsoleWriterEventArgs.ConsoleType type) {
if (this.newline) {
text = "[" + DateTime.Now.ToString("o") + "]-" + type.ToString() + ": " + value;
this.newline = false;
} else {
text = value;
}
origstream.Write(text);
base.Write(text);
base.Flush();
}
private void WriteLine(String value, TextWriter origstream, ConsoleWriterEventArgs.ConsoleType type) {
String text = this.newline ? "[" + DateTime.Now.ToString("o") + "]-" + type.ToString() + ": " + value : value;
this.newline = true;
origstream.WriteLine(text);
base.WriteLine(text);
base.Flush();
}
internal void Write(Object sender, ConsoleWriterEventArgs e) => this.Write(e.Value, e.Writer, e.StreamType);
internal void WriteLine(Object sender, ConsoleWriterEventArgs e) => this.WriteLine(e.Value, e.Writer, e.StreamType);
}
internal class ConsoleWriterEventArgs : EventArgs {
public String Value { get; private set; }
public TextWriter Writer { get; private set; }
public ConsoleType StreamType { get; private set; }
public enum ConsoleType {
Info,
Error
}
public ConsoleWriterEventArgs(String value, TextWriter writer, ConsoleType type) {
this.Value = value;
this.Writer = writer;
this.StreamType = type;
}
}
internal class ConsoleWriter : TextWriter {
private readonly TextWriter stream;
private readonly ConsoleWriterEventArgs.ConsoleType streamtype;
public ConsoleWriter(TextWriter writer, ConsoleWriterEventArgs.ConsoleType type) {
this.stream = writer;
this.streamtype = type;
}
this.newline = true;
origstream.WriteLine(text);
base.WriteLine(text);
base.Flush();
}
internal void Write(Object sender, ConsoleWriterEventArgs e) => this.Write(e.Value, e.Writer, e.StreamType);
internal void WriteLine(Object sender, ConsoleWriterEventArgs e) => this.WriteLine(e.Value, e.Writer, e.StreamType);
}
internal class ConsoleWriterEventArgs : EventArgs {
public String Value { get; private set; }
public TextWriter Writer { get; private set; }
public ConsoleType StreamType { get; private set; }
public enum ConsoleType {
Info,
Error
}
public ConsoleWriterEventArgs(String value, TextWriter writer, ConsoleType type) {
this.Value = value;
this.Writer = writer;
this.StreamType = type;
}
}
internal class ConsoleWriter : TextWriter {
private readonly TextWriter stream;
private readonly ConsoleWriterEventArgs.ConsoleType streamtype;
public ConsoleWriter(TextWriter writer, ConsoleWriterEventArgs.ConsoleType type) {
this.stream = writer;
this.streamtype = type;
}
public override Encoding Encoding => Encoding.UTF8;
public override void Write(String value) => this.WriteEvent?.Invoke(this, new ConsoleWriterEventArgs(value, this.stream, this.streamtype));
//base.Write(value);
public override void WriteLine(String value) => this.WriteLineEvent?.Invoke(this, new ConsoleWriterEventArgs(value, this.stream, this.streamtype));
//base.WriteLine(value);
public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
}
}
public override void Write(String value) => this.WriteEvent?.Invoke(this, new ConsoleWriterEventArgs(value, this.stream, this.streamtype));
//base.Write(value);
public override void WriteLine(String value) => this.WriteLineEvent?.Invoke(this, new ConsoleWriterEventArgs(value, this.stream, this.streamtype));
//base.WriteLine(value);
public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
}
}

View File

@ -8,37 +8,38 @@
<Company>BlubbFish</Company>
<Authors>BlubbFish</Authors>
<PackageId>Utils.BlubbFish</PackageId>
<Copyright>Copyright © BlubbFish 2014 - 09.01.2022</Copyright>
<Version>1.6.0</Version>
<Copyright>Copyright © BlubbFish 2014 - 20.01.2022</Copyright>
<Version>1.6.1</Version>
<NeutralLanguage>de-DE</NeutralLanguage>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils</PackageProjectUrl>
<RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils.git</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageReleaseNotes>
1.6.0 HttpEndpoint added
1.5.0 Add GetEvent so you can call events by string; Add OwnSingeton class
1.4.0 Add Helper to Utils
1.1.3 Improve CmdArgs
1.1.2 Tiny Codingstyles
1.1.1 ProgrammLogger neets to cleanup
1.1.0 ProgrammLogger
1.0.7.0 Yet another IniReader improvemnt round again
1.0.6.0 Yet another IniReader improvemnt round
1.0.5.2 And Improve IniReader again
1.0.5.1 Improve IniReader again
1.0.5.0 Improve IniReader
1.0.4.1 Cleanup OwnView
1.0.4.0 More Updater
1.0.3.2 Next Updater
1.0.3.1 EventArgsHelper
1.0.2.6 Better Updater
1.0.2.5 Logging in OwnObject
1.0.2.3 OwnModel better
1.0.2.2 Make it nice
1.0.2.1 Filemutex
1.0.0.1 Filelogger improvements
1.0.0.0 Init
1.6.1 - 2022-01-20 - ProgrammLogger Fixed
1.6.0 - 2022-01-09 - HttpEndpoint added
1.5.0 - 2021-04-10 - Add GetEvent so you can call events by string; Add OwnSingeton class
1.4.0 - 2018-11-27 - Add Helper to Utils
1.1.3 - 2018-10-02 - Improve CmdArgs
1.1.2 - 2018-09-11 - Tiny Codingstyles
1.1.1 - 2018-05-29 - ProgrammLogger neets to cleanup
1.1.0 - 2018-05-15 - ProgrammLogger
1.0.7.0 - 2018-05-08 - Yet another IniReader improvemnt round again
1.0.6.0 - 2017-12-22 - Yet another IniReader improvemnt round
1.0.5.2 - 2017-09-26 - And Improve IniReader again
1.0.5.1 - 2017-09-24 - Improve IniReader again
1.0.5.0 - 2017-08-09 - Improve IniReader
1.0.4.1 - 2017-08-08 - Cleanup OwnView
1.0.4.0 - 2017-04-30 - More Updater
1.0.3.2 - 2017-04-26 - Next Updater
1.0.3.1 - 2017-04-25 - EventArgsHelper
1.0.2.6 - 2017-04-24 - Better Updater
1.0.2.5 - 2017-04-19 - Logging in OwnObject
1.0.2.3 - 2017-04-16 - OwnModel better
1.0.2.2 - 2017-03-09 - Make it nice
1.0.2.1 - 2017-03-09 - Filemutex
1.0.0.1 - 2016-12-03 - Filelogger improvements
1.0.0.0 - 2015-11-16 - Init
</PackageReleaseNotes>
</PropertyGroup>