:- ensure_loaded('$REGULUS/PrologLib/compatibility'). :- module(logging, [ log_event/2, log_event/3, finish_logfile/0, read_logfile/2 ] ). :- use_module('$REGULUS/Prolog/regulus_utilities'). :- use_module('$REGULUS/PrologLib/utilities'). :- use_module(library(lists)). :- use_module(library(system)). 'SICSTUS4ONLY'( ( :- use_module(library(file_systems)) ) ). :- use_module(library(xml)). %----------------------------------------------------------- %log_start_new_session(CFGFile) :- % get_new_logfile_name(File), % set_current_logfile(File), % log_event('START_SESSION', [CFGFile]). %----------------------------------------------------------- log_event(Operation, Args) :- log_event(Operation, "*null_comment*", Args). log_event(Operation, CommentChars, Args) :- ( get_current_logfile(File) -> true ; get_new_logfile_name(File), write_logfile_header(File), set_current_logfile(File) ), log_event_to_logfile(Operation, CommentChars, Args, File). finish_logfile :- ( get_current_logfile(File) -> write_logfile_footer(File), unset_current_logfile ; format2error('~N*** Error: request to finish logfile but no current logfile defined~n', []), fail ). log_event_to_logfile(Operation, CommentChars, Args, File) :- open_regulus_file(File, append, S), write_log_term(S, Operation, CommentChars, Args), close(S), !. log_event_to_logfile(Operation, CommentChars, Args, File) :- format2error('~N*** Error: bad call: ~w~n', [log_event_to_logfile(Operation, CommentChars, Args, File)]), fail. %----------------------------------------------------------- write_logfile_header(File) :- open_regulus_file(File, append, S), format(S, "~N~n", []), format(S, "~N~n", []), close(S), !. write_logfile_header(File) :- format2error('~N*** Error: bad call: ~w~n', [write_logfile_header(File)]), fail. write_logfile_footer(File) :- open_regulus_file(File, append, S), format(S, "~N~n", []), close(S), !. write_logfile_footer(File) :- format2error('~N*** Error: bad call: ~w~n', [write_logfile_footer(File)]), fail. %----------------------------------------------------------- read_logfile(File, XMLTerm) :- absolute_file_name(File, AbsFile), read_file_to_string(AbsFile, String), xml_parse(String, XMLTerm). %----------------------------------------------------------- write_log_term(S, Operation, CommentChars, Args) :- datime(Datime), datime_to_timestamp(Datime, Timestamp), comment_atom(CommentChars, CommentAtom), write_log_term1(S, Timestamp, CommentAtom, Operation, Args). comment_atom("*null_comment*", '') :- !. comment_atom(CommentChars, CommentAtom) :- format_to_atom('comment="~s" ', [CommentChars], CommentAtom). write_log_term1(S, Timestamp, CommentAtom, Operation, []) :- format(S, '~N~n~n', [Operation, CommentAtom, Timestamp]), !. write_log_term1(S, Timestamp, CommentAtom, Operation, Args) :- format(S, '~N~n~n', [Operation, CommentAtom, Timestamp]), write_log_term_args(Args, 1, S), format(S, '~N~n', []), !. write_log_term_args([], _I, _S). write_log_term_args([F | R], I, S) :- write_log_term_arg(F, I, S), I1 is I + 1, !, write_log_term_args(R, I1, S). write_log_term_arg(Arg, I, S) :- make_arg_into_atom(Arg, Atom), format(S, '~N ~w~n', [I, Atom, I]), !. write_log_term_arg(Arg, I, S) :- format2error('~N*** Error: bad call: ~w~n', [write_log_term_arg(Arg, I, S)]), fail. %----------------------------------------------------------- make_arg_into_atom(Arg, Atom) :- atomic(Arg), !, Arg = Atom. make_arg_into_atom(Arg, Atom) :- is_list(Arg), make_arg_into_atom_list(Arg, AtomList), join_with_spaces(AtomList, Atom). make_arg_into_atom_list([], []). make_arg_into_atom_list([F | R], [F1 | R1]) :- make_arg_into_atom(F, F1), make_arg_into_atom_list(R, R1). %----------------------------------------------------------- get_new_logfile_name(AbsFile) :- get_logfile_dir(Dir), datime(Datime), datime_to_timestamp(Datime, Timestamp), format_to_atom('~w/log_~w.xml', [Dir, Timestamp], File), absolute_file_name(File, AbsFile), !. get_new_logfile_name(AbsFile) :- format2error('~N*** Error: bad call: ~w~n', [get_new_logfile_name(AbsFile)]), fail. get_logfile_dir(Dir) :- absolute_file_name('$REGULUS/logfiles', Dir), ( safe_directory_exists(Dir) -> true ; otherwise -> make_directory(Dir) ), !. get_logfile_dir(Dir) :- format2error('~N*** Error: bad call: ~w~n', [get_logfile_dir(Dir)]), fail. %----------------------------------------------------------- :- dynamic current_logfile/1. set_current_logfile(File) :- retractall(current_logfile(_)), assertz(current_logfile(File)). get_current_logfile(File) :- current_logfile(File). unset_current_logfile :- retractall(current_logfile(_)).