4

私は gen_server を書いていますが、これは単に gen_server_db と呼びますが、それほど特別なことは何もありません。使用するライブラリ (emysql) がデータベース サーバーを検索しようとしているときに (gen_server_db:init() で) 接続エラーが発生する可能性があります。例外をキャッチしてコンソールに何かを出力しようとすると、zip が表示されます。以下のコード サンプルの io:format メッセージはいずれも、コンソールに到達することはありません。ずっと前にこの理由を聞いたことを覚えているようですが、理由は思い出せません。

init(Args) ->
    % I've condensed the way I actually get this stuff to one line, but if I have a
    % database online I connect properly, so I know that I'm getting the Host, User, etc.  
    {Host, User, Password, DB, PoolSize} = application:get_env(gen_server_db, config),

    init_mysql_connection(gen_server_db_pool, PoolSize, User, Password, Host, DB),

    % When the net connection to the db is down, I never get here.
    ok.

init_mysql_connection(bgo_db_pool, PoolSize, User, Password, Host, DB) ->
    try
        emysql:add_pool(bgo_db_pool, PoolSize, User, Password, Host, 3306, DB, utf8)
    catch
        exit:failed_to_connect_to_database ->
            io:format("Cannot connect to the mysql database server.  Retrying in 1 sec.~n"),
            timer:sleep(1000),
            init_mysql_connection(bgo_db_pool, PoolSize, User, Password, Host, DB);
        Error:Reason ->
            io:format("Database connection error: ~p:~p~n", [Error, Reason]),
            1/0
    end.
4

2 に答える 2

4

io:format を介して送信されるすべての I/O は、実行中のプロセスの現在のgroup_leaderに送信されます。io:fwrite を使用してメッセージを出力するのは、このプロセスの役割です。

コーディング中にデバッグ情報をダンプしたいだけなら、erlang:display/1 を使用できます

于 2012-04-27T08:27:43.707 に答える
0

io:format の代わりに error_logger モジュールを使用することをお勧めします。io:format は、標準出力である tty コンソールにメッセージを出力します。gen_server がコンソールによって開始された場合、これらのメッセージが表示されますが、サーバーが切り離されたモードで開始された場合、これらのメッセージは表示されません。

これはマニュアルであり、SASL を開始する必要があります。

http://www.erlang.org/doc/man/error_logger.html

構成ファイル内で、このログの出力ファイルを定義する必要があります。

....
{sasl, [{sasl_error_logger, {file,"/tmp/sasl_error.log"}},{errlog_type, all}]}
....
于 2012-04-27T15:50:59.653 に答える