Browse Source

Added logging

Apollo 8 months ago
parent
commit
ba10d60128
7 changed files with 447 additions and 17 deletions
  1. 364 0
      Cargo.lock
  2. 3 0
      Cargo.toml
  3. 2 0
      src/lib.rs
  4. 48 0
      src/logger.rs
  5. 1 0
      src/main.rs
  6. 24 14
      src/object.rs
  7. 5 3
      src/types.rs

+ 364 - 0
Cargo.lock

@@ -16,6 +16,79 @@ dependencies = [
  "zerocopy",
 ]
 
+[[package]]
+name = "aho-corasick"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
+dependencies = [
+ "anstyle",
+ "windows-sys",
+]
+
 [[package]]
 name = "autocfg"
 version = "1.3.0"
@@ -57,18 +130,44 @@ dependencies = [
  "cipher",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+
 [[package]]
 name = "byteorder"
 version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
+[[package]]
+name = "cc"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052"
+
 [[package]]
 name = "cfg-if"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cipher"
 version = "0.4.4"
@@ -79,6 +178,12 @@ dependencies = [
  "inout",
 ]
 
+[[package]]
+name = "colorchoice"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
+
 [[package]]
 name = "const-random"
 version = "0.1.18"
@@ -99,6 +204,12 @@ dependencies = [
  "tiny-keccak",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+
 [[package]]
 name = "crunchy"
 version = "0.2.2"
@@ -115,6 +226,29 @@ dependencies = [
  "typenum",
 ]
 
+[[package]]
+name = "env_filter"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "env_filter",
+ "humantime",
+ "log",
+]
+
 [[package]]
 name = "generic-array"
 version = "0.14.7"
@@ -136,6 +270,35 @@ dependencies = [
  "wasi",
 ]
 
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "inout"
 version = "0.1.3"
@@ -154,23 +317,53 @@ dependencies = [
  "cfg-if",
 ]
 
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+
 [[package]]
 name = "itoa"
 version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
+[[package]]
+name = "js-sys"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+dependencies = [
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "libc"
 version = "0.2.155"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
 
+[[package]]
+name = "log"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
 [[package]]
 name = "moonmud"
 version = "0.1.0"
 dependencies = [
  "bcrypt",
+ "chrono",
+ "env_logger",
+ "log",
  "rhai",
  "serde",
  "serde_json",
@@ -209,6 +402,35 @@ dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "regex"
+version = "1.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+
 [[package]]
 name = "rhai"
 version = "1.19.0"
@@ -341,6 +563,12 @@ version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
 [[package]]
 name = "version_check"
 version = "0.9.4"
@@ -353,6 +581,142 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "zerocopy"
 version = "0.7.35"

+ 3 - 0
Cargo.toml

@@ -5,6 +5,9 @@ edition = "2021"
 
 [dependencies]
 bcrypt = "0.15.1"
+chrono = "0.4.38"
+env_logger = "0.11.3"
+log = "0.4.22"
 rhai = "1.19.0"
 serde = { version = "1.0.204", features = ["derive"] }
 serde_json = "1.0.120"

+ 2 - 0
src/lib.rs

@@ -1,5 +1,7 @@
 
 mod fs_util;
+mod logger;
+pub use logger::{init_logging, LevelFilter};
 
 mod types;
 pub use types::{Id, Kind, Inventory, Valid, next_id};

+ 48 - 0
src/logger.rs

@@ -0,0 +1,48 @@
+pub use log::{LevelFilter, trace, debug, info, warn, error};
+
+use chrono::Local;
+use std::fs::OpenOptions;
+use std::io::Write;
+use std::path;
+
+use crate::fs_util::{dir_exists, mkdir as create_dir};
+
+/// Must be done before any log macros can work
+///
+/// data/logs/moonmud-MM-DD-YYYY.log
+pub fn init_logging(level: LevelFilter) -> bool {
+    let f = String::from("data/logs");
+    if !dir_exists(&f) {
+        if !create_dir(&f) {
+            return false;
+        }
+    }
+    let mut pth = path::PathBuf::new();
+    pth.push(f);
+    let log_filename = format!("moonmud-{0}.log", Local::now().format("%m-%d-%Y"));
+    pth.push(log_filename);
+    let target = Box::new(
+        OpenOptions::new()
+            .write(true)
+            .append(true)
+            .create(true)
+            .open(&pth)
+            .expect(format!("Can't open log file (write/append/create): {}", &pth.as_path().to_string_lossy()).as_str()),
+    );
+    env_logger::Builder::new()
+        .target(env_logger::Target::Pipe(target))
+        .format(|buf, record| {
+            writeln!(
+                buf,
+                "[{} {:5} {}:{}] {}",
+                Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
+                record.level(),
+                record.file().unwrap_or("unknown"),
+                record.line().unwrap_or(0),
+                record.args()
+            )
+        })
+        .filter(None, level)
+        .init();
+    return true;
+}

+ 1 - 0
src/main.rs

@@ -2,6 +2,7 @@
 use moonmud::*;
 
 fn main() {
+    init_logging(LevelFilter::Trace);
     let o: Option<Object> = Object::load_player_by_name(&"Test Player".to_string());
     match o {
         Some(o) => {

+ 24 - 14
src/object.rs

@@ -1,6 +1,6 @@
 use serde::{Deserialize, Serialize};
 
-use crate::{fs_util::{dir_exists, file_exists, join, mkdir, read_dir}, Id, Inventory, Kind, Valid};
+use crate::{fs_util::{dir_exists, file_exists, join, mkdir, read_dir}, Id, Inventory, Kind, Valid, logger::{trace, debug}};
 
 #[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Default)]
 pub struct Object {
@@ -26,6 +26,7 @@ impl Valid for Object {
     fn valid(&self) -> bool {
         if self.kind == Kind::Player {
             if self.password.is_empty() {
+                debug!("Object.valid() > Player Missing Object.password");
                 return false;
             }
         }
@@ -41,25 +42,32 @@ impl Object {
                 self.password = hash;
                 true
             }
-            Err(_) => false
+            Err(e) => {
+                debug!("Object.set_password('{}') > {}", password, e);
+                false
+            }
         }
     }
     pub fn verify_password(&self, password: &String) -> bool {
         let verify = bcrypt::verify(password, self.password.as_str());
         match verify {
             Ok(ok) => ok,
-            Err(_) => false
+            Err(e) => {
+                debug!("Object.verify_password() > {}", e);
+                false
+            }
         }
     }
 
     pub fn load_file(filename: &String) -> Option<Object> {
         let p = crate::fs_util::join(&format!("{}", filename));
         if !file_exists(&p) {
+            trace!("Object.load_file('{}') > '{}' Doesn't exist", filename, p);
             return None;
         }
         let cont = crate::fs_util::read_file(&p);
         if cont.is_empty() {
-            eprintln!("Err reading '{}'", p);
+            debug!("Object.load_file('{}') > Failed reading '{}'", filename, p);
             return None;
         }
         Object::load(&cont)
@@ -69,7 +77,7 @@ impl Object {
         match obj {
             Ok(obj) => Some(obj),
             Err(e) => {
-                eprintln!("Err parsing, {}", e);
+                debug!("Object.load() > {}", e);
                 None
             }
         }
@@ -82,51 +90,53 @@ impl Object {
         let dir = read_dir(&p, false);
         if dir.is_empty() {
             if !dir_exists(&p) {
+                trace!("Object.load_player_by_name('{}') > data/objects directory doesn't exist, creating", name);
                 mkdir(&p);
             }
             return None;
         }
         for entry in dir.iter() {
-            eprintln!("Trying '{}'", entry);
+            //trace!("Object.load_player_by_name('{}') > Trying '{}'", name, entry);
             let obj = Object::load_file(entry);
             match obj {
                 Some(obj) => {
-                    eprintln!("OK");
                     if obj.name == *name && obj.kind == Kind::Player {
+                        trace!("Object.load_player_by_name('{}') > Found in '{}'", name, entry);
                         return Some(obj);
                     }
                 }
                 None => {
-                    eprintln!("ERR");
+                    trace!("Object.load_player_by_name('{}') > Errors in '{}'", name, entry);
                 }
             }
         }
+        trace!("Object.load_player_by_name('{}') > Not found", name);
         None
     }
     pub fn save(&mut self) -> bool {
         if !self.valid() {
-            eprintln!("Object not valid, won't save");
+            debug!("Object.save() > Not valid, won't save");
             return false;
         }
         let p = crate::fs_util::join(&format!("data/objects/{}.json", self.id));
         let dir = crate::fs_util::join(&"data/objects".to_string());
         if !crate::fs_util::dir_exists(&dir) {
-            eprintln!("Missing data/objects dir, creating... '{}'", dir);
+            debug!("Object.save() > Missing '{}' directory, creating...", dir);
             if !crate::fs_util::mkdir(&dir) {
-                eprintln!("Err while making data/objects dir, '{}'", dir);
+                debug!("Object.save() > Failed creating '{}' directory", dir);
             }
         }
         let cont = serde_json::to_string(self);
         match cont {
             Ok(cont) => {
                 if !crate::fs_util::write_file(&p, &cont) {
-                    eprintln!("Err while writing to '{}'", p);
+                    debug!("Object.save() > Failed writing '{}'", p);
                     return false;
                 }
                 true
             }
-            Err(_) => {
-                eprintln!("Err while serializing");
+            Err(e) => {
+                debug!("Object.save() > Failed serializing, {}", e);
                 false
             }
         }

+ 5 - 3
src/types.rs

@@ -1,5 +1,6 @@
 use std::collections::HashMap;
 
+use crate::logger::trace;
 use serde::{Deserialize, Serialize};
 
 use crate::{fs_util::{dir_exists, join, mkdir, read_dir}, object::Object};
@@ -23,24 +24,25 @@ pub fn next_id() -> Id {
         if !dir_exists(&p) {
             mkdir(&p);
         }
+        trace!("next_id() > Empty dir > 1");
         return 1;
     }
     let mut last: Id = 1;
     for entry in dir.iter() {
-        eprintln!("Trying '{}'", entry);
+        //eprintln!("Trying '{}'", entry);
         let obj = Object::load_file(entry);
         match obj {
             Some(obj) => {
-                eprintln!("OK");
                 if last < obj.id {
                     last = obj.id;
                 }
             }
             None => {
-                eprintln!("ERR");
+                trace!("next_id() > Errors in '{}'", entry);
             }
         }
     }
+    trace!("next_id() > {}", last + 1);
     last + 1
 }