Login
Спрятать logging code
NEW 02.08.06 16:01
in Antwort voxel3d 02.08.06 15:57
Да от нефиг делать, понятно. И чтобы спровоцировать Мурра на его обычные рассуждения о ненужности поделок дяди Билли :-D
В ответ на:
{
log("Enter: Pruefmodul::run");
const ExportParameter& exppar = ExportParameter::getParameter();
if (!init())
return false;
uint handle = 0;
strn javaExe(winFindExecutable("java.exe"));
log("javaExe: "-javaExe);
if (len(javaExe) == 0)
{
Error e(Error::INVALID_CONFIG, Error::E_SEVERE);
return false;
}
strn actualDir(GetDir());
log("actualDir: "-actualDir);
ChDir(exppar.getKBVRootDir());
log("Enter loop...");
for (int i = 1; i <= exppar.getDMPType()->getParamCount(); i++)
{
log("i = "-cvs(i));
if (i > 1)
wait_100ms(20); // <2DO> PM kann nicht zweimal gestartet - besser auf Processende warten
strn pm_param = exppar.getDMPType()->getPruefmodulParams()(i).stripBlanks() - " -z " - dmpDateiname;
log(pm_param);
handle = winExecuteProgram(javaExe, pm_param, true);
log("handle: "- cvs(handle));
if (handle)
{
int code = winGetProcessReturnCode(handle);
log("winGetProcessReturnCode: "-cvs(code));
if (code >= 3)
{
Error e(Error::FILE_NOT_ACCEPTED, Error::E_SEVERE, "Prfmodul: Fehler "-cvs(code));
ChDir(actualDir);
return false;
}
}
else
{
Error e(Error::INVALID_CONFIG, Error::E_SEVERE, "Prfmodul konnte nicht gestartet werden");
ChDir(actualDir);
return false;
}
}
log("End loop");
ChDir(actualDir);
return parseProtocol();
}
02.08.06 16:07
in Antwort Simple 02.08.06 16:01
Вах, а зачем оно такое нужно? Похоже здесь - никак.
---
В пивной: Мертвой рыбой по столу не стучать!
---
В пивной: Мертвой рыбой по столу не стучать!
NEW 02.08.06 16:07
in Antwort Simple 02.08.06 16:01
NEW 02.08.06 16:12
in Antwort scorpi_ 02.08.06 16:07
Проблем как таковых у этого кода нет :) Корявый, конечно, но пока трогать не буду. А логи мне нужны, потому что там видно, что юзеры с установками накосячили.
NEW 02.08.06 16:16
in Antwort Simple 02.08.06 16:13
Не проще ли написать модуль проверяющий валидность переменных и наличие апликух?
---
Hам нечего терять,кроме своих винтов
---
Hам нечего терять,кроме своих винтов
NEW 02.08.06 16:30
in Antwort Simple 02.08.06 16:01, Zuletzt geändert 02.08.06 16:40 (voxel3d)
Конкретно здесь, никак. Тебе вместо обдумывания, как прозрачно логгер воткнуть, надо разнести функциональность: сбор всех параметров в одном месте, итератор пробегающий по коллекции отдельно, лаунчер процессов отдельно. У тебя нет на самом деле проблемы с логгером, у тебя просто микс функциональности в одном методе. Когда разнесёшь, логгер дёргаемый из итератора и лаунчера уже не будeт код засорять.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 02.08.06 16:39
in Antwort scorpi_ 02.08.06 15:59, Zuletzt geändert 02.08.06 16:39 (voxel3d)
> Обращения к объектам неинтересны, интересны вызовы функций.
Не согласен. Интересно состояние объектов на момент каких-то вызовов. Вот, как раз, враппер и позволяет прозрачно лог скинуть в этот момент.
Простой пример: выполнение SQL запроса в теле программы. Всякая мелочь типа вылидных ссылок разруливается ассертами, а львиная доля ошибок - неправильно написанный SQL запрос. Текст запроса как раз интересен в логе.
Не согласен. Интересно состояние объектов на момент каких-то вызовов. Вот, как раз, враппер и позволяет прозрачно лог скинуть в этот момент.
Простой пример: выполнение SQL запроса в теле программы. Всякая мелочь типа вылидных ссылок разруливается ассертами, а львиная доля ошибок - неправильно написанный SQL запрос. Текст запроса как раз интересен в логе.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 02.08.06 17:41
in Antwort voxel3d 02.08.06 16:39
неправильно написанный SQL запрос отсеивается методами TDD
NEW 02.08.06 18:00
in Antwort Simple 02.08.06 16:01
Ну а оно тебе надо вс╦ писать в лог? Интересны ошибки. Короче говоря на скорую руку я бы написал нечто вроде:
В ответ на:
class Executor : unary_function< const DMPType&, void >
{
const ExportParameter& exppar_;
string java_path_;
string actualDir_;
void log_and_throw( string const& msg)
{
LOG << level(basic_logger::DEBUG) << parameter, environment, etc... << endl;
throw runtime_error( msg );
}
public:
Executor( const ExportParameter& exp ) : exppar_( exp ),
java_path_( winFindExecutable("java.exe") ),
actualDir_( GetDir() )
{
init();
ChDir( exppar_.getKBVRootDir() );
}
~Executor()
{
if ( ! actualDir_.empty() )
ChDir( actualDir );
}
void operator()( const Parameters& p )
{
HANDLE handle = winExecuteProgram( java_path_, cmd, true );
if ( handle )
{
WaitForSingleObject( handle, INFINITE );
int code = winGetProcessReturnCode( handle );
if ( code > 2 )
log_and_throw( "Pruefmodul: Fehler " + to_string( code ) );
}
else
log_and_throw( "Pruefmodul konnte nicht gestartet werden" );
}
};
{
try {
const ExportParameter& exppar = ExportParameter::getParameter();
for_each( exppar.getDMPType().begin(), exppar.getDMPType().end(), Executor( exppar ) );
}
catch( runtime_error const& ) {
return false;
}
return parseProtocol();
}
NEW 02.08.06 18:01
in Antwort voxel3d 02.08.06 16:39
Вот, как раз, враппер и позволяет прозрачно лог скинуть в этот момент.
Один враппер для любых объектов? Не поделишься?
Один враппер для любых объектов? Не поделишься?
NEW 02.08.06 19:57
in Antwort scorpi_ 02.08.06 18:01
А примешь два условия?
Первое: "любые" типы должны будут ostream& operator<<(ostream &stream, MyClass ob) имплементировать.
Второе: принимаем, что оператор присваивания для объекта "любого" типа устанавливает необходимость дампа состояния.
Первое: "любые" типы должны будут ostream& operator<<(ostream &stream, MyClass ob) имплементировать.
Второе: принимаем, что оператор присваивания для объекта "любого" типа устанавливает необходимость дампа состояния.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 02.08.06 20:22
in Antwort voxel3d 02.08.06 19:57, Zuletzt geändert 02.08.06 20:24 (scorpi_)
Понятно. Дальше всё тривиально. На мой взгляд тут policy напрашивается - взять SmartPtr у Alexandrescu, и добавить Logging policy (либо заимплементировать вариант Checking policy c логированием).
PS Проблема тут в другом - этот оператор я часто использовал для других целей.
PS Проблема тут в другом - этот оператор я часто использовал для других целей.
NEW 02.08.06 21:48
in Antwort voxel3d 02.08.06 15:39
Шаблоны, С++, мне еще смотреть надо. В общих чертах что к чему знаю, но последний раз пользовался где-то во времена Borland C++ 3.0... Тогда они мне не понравились...

NEW 02.08.06 22:04
in Antwort voxel3d 02.08.06 16:39
> Обращения к объектам неинтересны, интересны вызовы функций.
Не согласен. Интересно состояние объектов на момент каких-то вызовов.
------
Тоже не согласен, но по другому поводу. Последнее время все больше получается код, в котором чистых методов практически нет. Если есть - то что-то внутреннее, прозрачное в контексте соответствующего уровня объекта. А так - присваивание значения свойству изменяет объект, при этом интерес представляет состояние объекта до и после, а так же успешность выполнения присвоения значения.
выполнение SQL запроса в теле программы.
-----
В теле "программы" он может и строится, но выполняется где-то в другом месте. Если выкинуть построение SQL-строки, то ситуация разруливается построением правильного вызова серверной процедуры - это намного проще, так как значительная часть рутинных проверок и конвертаций выполняется вне приложения - Параметром, а интересным на момент вызова, будет состояние бизнес-объекта, что много проще. Если уж приспичит посмотреть что выполнялось в базе - профайлер...
Не согласен. Интересно состояние объектов на момент каких-то вызовов.
------
Тоже не согласен, но по другому поводу. Последнее время все больше получается код, в котором чистых методов практически нет. Если есть - то что-то внутреннее, прозрачное в контексте соответствующего уровня объекта. А так - присваивание значения свойству изменяет объект, при этом интерес представляет состояние объекта до и после, а так же успешность выполнения присвоения значения.

выполнение SQL запроса в теле программы.
-----
В теле "программы" он может и строится, но выполняется где-то в другом месте. Если выкинуть построение SQL-строки, то ситуация разруливается построением правильного вызова серверной процедуры - это намного проще, так как значительная часть рутинных проверок и конвертаций выполняется вне приложения - Параметром, а интересным на момент вызова, будет состояние бизнес-объекта, что много проще. Если уж приспичит посмотреть что выполнялось в базе - профайлер...

NEW 02.08.06 22:29
in Antwort scorpi_ 02.08.06 20:22
> PS Проблема тут в другом - этот оператор я часто использовал для других целей.
Я бы предложил, в случае реализации идеи с враппером, использовать его только с POD типами, таким образом убив сразу двух зайцев - отпала бы необходимость релизовывать имплементацию оператора <<, она уже имеется и делает то, что надо, и для составных типов оператор остался бы свободен. Проблема была бы в другом, как удачно скомбинировать автологгирование сразу для множества объектов. В принципе, проблема решаемая, например, передачей массива ссылок на существующие объекты, состояние которых надо выводить в лог вместе с данным объектом. Либо заменив примитивный массив, классом-комбинатором.
Я бы предложил, в случае реализации идеи с враппером, использовать его только с POD типами, таким образом убив сразу двух зайцев - отпала бы необходимость релизовывать имплементацию оператора <<, она уже имеется и делает то, что надо, и для составных типов оператор остался бы свободен. Проблема была бы в другом, как удачно скомбинировать автологгирование сразу для множества объектов. В принципе, проблема решаемая, например, передачей массива ссылок на существующие объекты, состояние которых надо выводить в лог вместе с данным объектом. Либо заменив примитивный массив, классом-комбинатором.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 02.08.06 23:54
in Antwort scorpi_ 02.08.06 18:00, Zuletzt geändert 02.08.06 23:58 (Simple)
Как я уже говорил, лог мне нужен, чтобы видеть, что юзеры накосячили с инсталляцией. А то звонят такие в саппорт, а саппорт идет ко мне, чтобы я кролика из шляпы вытащил.
Exceptions у нас, кстати, не используются :/
зы Спасибо за код :) В принципе, я нечто такое и предполагал. Сказывается отсутствие навыков работы со стандартной библиотекой :(
Exceptions у нас, кстати, не используются :/
зы Спасибо за код :) В принципе, я нечто такое и предполагал. Сказывается отсутствие навыков работы со стандартной библиотекой :(
NEW 03.08.06 02:06
in Antwort Simple 02.08.06 23:54
Как я уже говорил, лог мне нужен, чтобы видеть, что юзеры накосячили с инсталляцией.
Инсталлер есть?
А то звонят такие в саппорт, а саппорт идет ко мне, чтобы я кролика из шляпы вытащил.
Ну дык, если ошибка была, то инфа осталась
Exceptions у нас, кстати, не используются
Ну и зря, они сильно упрощают код.
Инсталлер есть?
А то звонят такие в саппорт, а саппорт идет ко мне, чтобы я кролика из шляпы вытащил.
Ну дык, если ошибка была, то инфа осталась
Exceptions у нас, кстати, не используются
Ну и зря, они сильно упрощают код.
NEW 03.08.06 02:14
in Antwort voxel3d 02.08.06 22:29
использовать его только с POD типами, таким образом убив сразу двух зайцев - отпала бы необходимость релизовывать имплементацию оператора <<, она уже имеется
??? Откуда он имеется?
Главный недостаток твоей идеи в следующем - откуда ты возьмёшь инфу, в связи с чём обращение в объекту понадобилось? У тебя нет информации об операции, а без неё от знания состояния объекта толку мало.
??? Откуда он имеется?
Главный недостаток твоей идеи в следующем - откуда ты возьмёшь инфу, в связи с чём обращение в объекту понадобилось? У тебя нет информации об операции, а без неё от знания состояния объекта толку мало.