Compare commits

..

2 Commits

Author SHA1 Message Date
cc579102cb [1.6.2] ProgrammLogger improved 2022-01-30 22:40:25 +01:00
e3d37988c9 [1.6.1] ProgrammLogger Fixed 2022-01-20 19:42:14 +01:00
4 changed files with 215 additions and 177 deletions

View File

@ -1,5 +1,20 @@
# Changelog
## 1.6.2 - 2022-01-30 - ProgrammLogger improved
### New Features
* ProgrammLogger can now have a path while init, so not need to move the file
* Make it possible that two instances can use the same logfile
* IniReader GetValue can now have a default that returns if no setting is found
### Bugfixes
### Changes
* Codingstyles
## 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

@ -31,8 +31,7 @@ namespace BlubbFish.Utils {
return false;
}
private InIReader(String filename)
{
private InIReader(String filename) {
foreach (String path in search_path) {
if (File.Exists(path + Path.DirectorySeparatorChar + filename)) {
this.filename = path + Path.DirectorySeparatorChar + filename;
@ -60,8 +59,7 @@ namespace BlubbFish.Utils {
/// </summary>
/// <param name="filename">Dateiname</param>
/// <returns></returns>
public static InIReader GetInstance(String filename)
{
public static InIReader GetInstance(String filename) {
if (!instances.Keys.Contains(filename)) {
instances.Add(filename, new InIReader(filename));
}
@ -70,8 +68,7 @@ namespace BlubbFish.Utils {
private void ReadAgain(Object sender, EventArgs e) => this.LoadFile();
private void LoadFile()
{
private void LoadFile() {
this.inifile = new Dictionary<String, Dictionary<String, String>>();
StreamReader file = new StreamReader(this.filename);
List<String> buf = new List<String>();
@ -152,12 +149,11 @@ namespace BlubbFish.Utils {
/// <param name="section">Name der Sektion</param>
/// <param name="key">Name des Wertes</param>
/// <returns></returns>
public String GetValue(String section, String key)
{
public String GetValue(String section, String key, String @default = null) {
if (!section.StartsWith("[")) {
section = "[" + section + "]";
}
return this.inifile.Keys.Contains(section) && this.inifile[section].Keys.Contains(key) ? this.inifile[section][key] : null;
return this.inifile.Keys.Contains(section) && this.inifile[section].Keys.Contains(key) ? this.inifile[section][key] : @default;
}
/// <summary>

View File

@ -1,150 +1,175 @@
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.Runtime.InteropServices;
using System.Text;
namespace BlubbFish.Utils {
public class ProgramLogger {
private FileWriter fw;
private ConsoleWriter stdout;
private ConsoleWriter errout;
private String loggerfile;
public ProgramLogger(String path = null) {
this.loggerfile = path ?? 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(FileWriter.GetFileSteam(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(FileWriter.GetFileSteam(this.loggerfile, true));
this.AttachToFw();
}
public void Dispose() {
this.DisattachToFw();
this.fw.Dispose();
}
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(FileStream fs) : base(fs) {
}
public static FileStream GetFileSteam(String path, Boolean append) => File.Open(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? FileShare.Write : FileShare.ReadWrite);
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,39 @@
<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 - 30.01.2022</Copyright>
<Version>1.6.2</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.2 - 2022-01-30 - ProgrammLogger improved
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>