2012-04-26 13 views
4

私はgen_server_dbと呼ぶgen_serverを書いています。 (gen_server_db:init()内の)データベースサーバを見つけようとしているときに、使用しているライブラリ(emysql)が接続に失敗する可能性があります。私は例外をキャッチし、コンソールに何かを印刷しようとすると、私はzipを取得します。以下のコードサンプルでは、​​io:形式のメッセージのいずれも、コンソールには到達しません。私はずっと前にこの理由を聞いているように思いますが、理由を思い出すことはできません。erlang io:フォーマット出力が失われ、復元するために何をする必要がありますか?

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. 
+0

グループリーダーのリダイレクトが行われていないように見えるため、出力が表示されない可能性がある理由の1つは、実際にはそれほど大きくないことです。 init(Args)の最初のものとしてio:format()を呼び出して、initコードがまったく実行されていることを確かめてみましたか?また、gen_serverが停止したときにSASLを起動してクラッシュレポートを取得してみてください。 – RichardC

答えて

3

すべてのI/Oは、IOを介して送信される:フォーマットは、プロセスの現在のgroup_leaderが実行されてに送信されます。 io:fwriteを使用してメッセージを出力するのは、このプロセスの責任です。

あなたはちょうどあなたがアーランを使用することができますコーディングしながら、いくつかのデバッグ情報をダンプする場合:表示/ 1

+0

最後に、コンソールでglobal:register_name(io_format_target、group_leader())を使用し、io:format(global:whereis_name(io_format_target)、 "foo〜p〜n"、[bar])を使用しました。 – Sniggerfardimungus

0

私はあなたの代わりに、IOの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}]} 
.... 
関連する問題