diff --git a/.travis.yml b/.travis.yml index e2bc4a5192..2559dcab32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,7 @@ addons: - libc6-i386 - libgcc1:i386 - libstdc++6:i386 + - libssl-dev:i386 before_script: - chmod +x ./install-byond.sh diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm index 229d0b94ad..10a6485c44 100644 --- a/code/__defines/_compile_options.dm +++ b/code/__defines/_compile_options.dm @@ -7,6 +7,10 @@ 2 for preloading absolutely everything; */ +#define RUST_G "rust_g" // If uncommented, we will use the rust-g (https://github.com/tgstation/rust-g) native library for fast + // logging. This requires you to have the rust_g.dll or rust_g (renamed from librust_g.so) installed in the root folder or BYOND/bin + // The define's value should be the name of library file. + // ZAS Compile Options //#define ZASDBG // Uncomment to turn on super detailed ZAS debugging that probably won't even compile. #define MULTIZAS // Uncomment to turn on Multi-Z ZAS Support! diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index ee8949f535..c771de02ef 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -1,38 +1,51 @@ //print an error message to world.log +// Fall back to using old format if we are not using rust-g +#ifdef RUST_G + #define WRITE_LOG(log, text) call(RUST_G, "log_write")(log, text) +#else + #define WRITE_LOG(log, text) log << "\[[time_stamp()]][text]" +#endif -// On Linux/Unix systems the line endings are LF, on windows it's CRLF, admins that don't use notepad++ -// will get logs that are one big line if the system is Linux and they are using notepad. This solves it by adding CR to every line ending -// in the logs. ascii character 13 = CR - -/var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" +/* For logging round startup. */ +/proc/start_log(log) + #ifndef RUST_G + log = file(log) + #endif + WRITE_LOG(log, "START: Starting up [log_path].") + return log +/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */ +/proc/shutdown_logging() + #ifdef RUST_G + call(RUST_G, "log_close_all")() + #endif /proc/error(msg) - world.log << "## ERROR: [msg][log_end]" + world.log << "## ERROR: [msg]" #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") //print a warning message to world.log /proc/warning(msg) - world.log << "## WARNING: [msg][log_end]" + world.log << "## WARNING: [msg]" //print a testing-mode debug message to world.log /proc/testing(msg) - world.log << "## TESTING: [msg][log_end]" + world.log << "## TESTING: [msg]" /proc/log_admin(text) admin_log.Add(text) if (config.log_admin) - diary << "\[[time_stamp()]]ADMIN: [text][log_end]" + WRITE_LOG(diary, "ADMIN: [text]") /proc/log_adminpm(text, client/source, client/dest) admin_log.Add(text) if (config.log_admin) - diary << "\[[time_stamp()]]ADMINPM: [key_name(source)]->[key_name(dest)]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "ADMINPM: [key_name(source)]->[key_name(dest)]: [html_decode(text)]") /proc/log_debug(text) if (config.log_debug) - debug_log << "\[[time_stamp()]]DEBUG: [text][log_end]" + WRITE_LOG(debug_log, "DEBUG: [text]") for(var/client/C in admins) if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs)) @@ -40,89 +53,97 @@ /proc/log_game(text) if (config.log_game) - diary << "\[[time_stamp()]]GAME: [text][log_end]" + WRITE_LOG(diary, "GAME: [text]") /proc/log_vote(text) if (config.log_vote) - diary << "\[[time_stamp()]]VOTE: [text][log_end]" + WRITE_LOG(diary, "VOTE: [text]") /proc/log_access_in(client/new_client) if (config.log_access) var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]" - diary << "\[[time_stamp()]]ACCESS IN: [message][log_end]" + WRITE_LOG(diary, "ACCESS IN: [message]") /proc/log_access_out(mob/last_mob) if (config.log_access) var/message = "[key_name(last_mob)] - IP:[last_mob.lastKnownIP] - CID:Logged Out - BYOND Logged Out" - diary << "\[[time_stamp()]]ACCESS OUT: [message][log_end]" + WRITE_LOG(diary, "ACCESS OUT: [message]") /proc/log_say(text, mob/speaker) if (config.log_say) - diary << "\[[time_stamp()]]SAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_ooc(text, client/user) if (config.log_ooc) - diary << "\[[time_stamp()]]OOC: [user.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]") /proc/log_aooc(text, client/user) if (config.log_ooc) - diary << "\[[time_stamp()]]AOOC: [user.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]") /proc/log_looc(text, client/user) if (config.log_ooc) - diary << "\[[time_stamp()]]LOOC: [user.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]") /proc/log_whisper(text, mob/speaker) if (config.log_whisper) - diary << "\[[time_stamp()]]WHISPER: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_emote(text, mob/speaker) if (config.log_emote) - diary << "\[[time_stamp()]]EMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_attack(attacker, defender, message) if (config.log_attack) - diary << "\[[time_stamp()]]ATTACK: [attacker] against [defender]: [message][log_end]" + WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]") /proc/log_adminsay(text, mob/speaker) if (config.log_adminchat) - diary << "\[[time_stamp()]]ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_modsay(text, mob/speaker) if (config.log_adminchat) - diary << "\[[time_stamp()]]MODSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "MODSAY: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_eventsay(text, mob/speaker) if (config.log_adminchat) - diary << "\[[time_stamp()]]EVENTSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "EVENTSAY: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_ghostsay(text, mob/speaker) if (config.log_say) - diary << "\[[time_stamp()]]DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_ghostemote(text, mob/speaker) if (config.log_emote) - diary << "\[[time_stamp()]]DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_adminwarn(text) if (config.log_adminwarn) - diary << "\[[time_stamp()]]ADMINWARN: [html_decode(text)][log_end]" + WRITE_LOG(diary, "ADMINWARN: [html_decode(text)]") /proc/log_pda(text, mob/speaker) if (config.log_pda) - diary << "\[[time_stamp()]]PDA: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_to_dd(text) world.log << text //this comes before the config check because it can't possibly runtime if(config.log_world_output) - diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]" + WRITE_LOG(diary, "DD_OUTPUT: [text]") /proc/log_error(text) world.log << text - error_log << "\[[time_stamp()]]RUNTIME: [text][log_end]" + WRITE_LOG(error_log, "RUNTIME: [text]") /proc/log_misc(text) - diary << "\[[time_stamp()]]MISC: [text][log_end]" + WRITE_LOG(diary, "MISC: [text]") + +/proc/log_topic(text) + if(Debug2) + WRITE_LOG(diary, "TOPIC: [text]") + +/proc/log_href(text) + // Configs are checked by caller + WRITE_LOG(href_logfile, "HREF: [text]") /proc/log_unit_test(text) world.log << "## UNIT_TEST: [text]" diff --git a/code/_helpers/logging_vr.dm b/code/_helpers/logging_vr.dm index 66a91e0c2e..aa117125dc 100644 --- a/code/_helpers/logging_vr.dm +++ b/code/_helpers/logging_vr.dm @@ -1,11 +1,11 @@ /proc/log_nsay(text, inside, mob/speaker) if (config.log_say) - diary << "\[[time_stamp()]]NSAY (NIF:[inside]): [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "NSAY (NIF:[inside]): [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_nme(text, inside, mob/speaker) if (config.log_emote) - diary << "\[[time_stamp()]]NME (NIF:[inside]): [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "NME (NIF:[inside]): [speaker.simple_info_line()]: [html_decode(text)]") /proc/log_subtle(text, mob/speaker) if (config.log_emote) - diary << "\[[time_stamp()]]SUBTLE: [speaker.simple_info_line()]: [html_decode(text)][log_end]" + WRITE_LOG(diary, "SUBTLE: [speaker.simple_info_line()]: [html_decode(text)]") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index fe37d19f4b..e430894b90 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -64,7 +64,7 @@ //Logs all hrefs if(config && config.log_hrefs && href_logfile) - href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + href_logfile << "[src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]" switch(href_list["_src_"]) if("holder") hsrc = holder diff --git a/code/world.dm b/code/world.dm index 07bda88881..a78dd7c6a3 100644 --- a/code/world.dm +++ b/code/world.dm @@ -43,11 +43,11 @@ var/global/datum/global_init/init = new () world.log << "Map Loading Complete" //logs log_path += time2text(world.realtime, "YYYY/MM-Month/DD-Day/round-hh-mm-ss") - diary = file("[log_path].log") - href_logfile = file("[log_path]-hrefs.htm") - error_log = file("[log_path]-error.log") - debug_log = file("[log_path]-debug.log") - debug_log << "[log_end]\n[log_end]\nStarting up. [time_stamp()][log_end]\n---------------------[log_end]" + diary = start_log("[log_path].log") + href_logfile = start_log("[log_path]-hrefs.htm") + error_log = start_log("[log_path]-error.log") + debug_log = start_log("[log_path]-debug.log") + changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently if(byond_version < RECOMMENDED_VERSION) @@ -59,8 +59,9 @@ var/global/datum/global_init/init = new () // dumb and hardcoded but I don't care~ config.server_name += " #[(world.port % 1000) / 100]" - if(config && config.log_runtime) - log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log") + // TODO - Figure out what this is. Can you assign to world.log? + // if(config && config.log_runtime) + // log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log") callHook("startup") //Emergency Fix @@ -147,7 +148,7 @@ var/world_topic_spam_protect_ip = "0.0.0.0" var/world_topic_spam_protect_time = world.timeofday /world/Topic(T, addr, master, key) - debug_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key][log_end]" + log_topic("\"[T]\", from:[addr], master:[master], key:[key]") if (T == "ping") var/x = 1 @@ -450,6 +451,7 @@ var/world_topic_spam_protect_time = world.timeofday if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite C << link("byond://[config.server]") + shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. ..(reason) /hook/startup/proc/loadMode() diff --git a/rust_g b/rust_g new file mode 100644 index 0000000000..1a623a422f Binary files /dev/null and b/rust_g differ diff --git a/rust_g.dll b/rust_g.dll new file mode 100644 index 0000000000..817a522b61 Binary files /dev/null and b/rust_g.dll differ