質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • C#

    9267questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    634questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • IIS

    214questions

    IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

C#でlog4netを使ったログ出力の環境での違いについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,433

andkirato

score 1

質問内容

行き詰ってしまい、質問させてください。

環境A
Windows Server 2012 R2
IIS 8.5
.net framework 4.5

環境B
Windows 8 Pro
IIS 8.5
.net framework 4.5

開発言語:C#

asp.netでWebページを作成しビルドしたものを、環境A、環境Bにそれぞれに同じものを置いています。
このプログラムではlog4netを使ってクラス名とメソッド名等をログに出力しているのですが
環境Aでは上手く出力されず、環境Bでは正常に出力されています。
(クラス名、メソッド名以外は両方とも正常に出力されています)

環境Aの出力内容
System.Web.UI.Page : Void ProcessRequestMain(Boolean, Boolean)
環境Bの出力内容
フォルダパス.クラス名 : Void Page_Load(System.Object, System.EventArgs)

クラス名、メソッド名の取得方法

クラス名、メソッド名の取得は以下のようにしています。

// クラス名の取得
new StackFrame(4).GetMethod().ReflectedType.FullName;

// メソッド名の取得
new StackFrame(4).GetMethod();

IISの設定が悪いのかとも思い、いろいろ試してみたのですが
さっぱりわからず行き詰ってしまいました。

環境Aでも最初は正常に出力されていたのですが、
ビルドしなおしてからおかしくなりました。
ビルドオプションなどを変えてはいないはずなのですが原因がわかりません。

コードの最適化オプションがついていました。

あと、環境Aでも一部のページのみ正常に出力されます。

なにかご存知の方いらっしゃいましたらご教授お願いします。

以上よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/08/31 01:33

    環境 B の Web サーバーは IIS に間違いないのですか? 開発マシンで Visual Studio から IIS Express で実行とか?

    キャンセル

  • andkirato

    2017/08/31 09:42

    IISで間違いありません。Visual Studioで開発は行っていますが実行環境を合わせるためIISの設定を行い実行しています。

    キャンセル

  • SurferOnWww

    2017/08/31 15:27

    ワーカープロセスの違いがあるのかなぁと思ってましたが、それがハズレだとすると、今提供されている情報では自分には見当がつきません。お役に立てずすみませんが、他の方の回答をお待ちください。

    キャンセル

回答 2

checkベストアンサー

+1

リリースビルドや最適化を行っているとStackFrameで取得できない場合があります。

参考:C# メソッドの呼び出し元メソッド名を取得するおまじない - Qiita

リリースビルドにはシンボル情報がないため、ファイル、メソッド名、行番号が取得できないようです。
リリースビルドでもPDBファイルを生成すると、シンボル情報を利用できるようです。
最適化を抑止しないと、正しいメソッド名、行番号が取れない場合があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 13:02

    回答ありがとうございます。
    やはり、StackFrameがどのようにしてクラス名等を取得しているかわからないと解決は難しい気がします。
    (環境に依存する?)
    ちなみに、PDBファイルは生成しています。

    キャンセル

  • 2017/09/06 14:23

    StackFrameはコールスタックとシンボル情報から取得するものなので、最適化によりソースコードとの対応が失われることでStackFrameでは取得できないのでしょう。
    .NET Framework 4.5であれば、参考リンクでも言及されているCallerMemberNameAttributeが使えます。こちらはコンパイル時にメソッド名を埋め込むため最適化の影響を受けません。
    メソッド名の他、ソースファイルのパスや行番号のAttributeもあります。
    https://msdn.microsoft.com/ja-jp/library/hh534540(v=vs.110).aspx

    キャンセル

  • 2017/09/07 09:26

    回答ありがとうございます。
    結局、A,Bの違いについてはわからないままですが
    StackFrameを使用時は最適化はしないということで(強引ですが)解決にしたいと思います。
    ご回答いただいた皆様、ありがとうございました。

    キャンセル

0

こんにちは。

私もログ書き込みではないですが、前に嵌ったことがあるのですが
WindowsServer2012は結構、権限が厳しくなっているので
ログ出力先の権限にIISユーザの書き込み権限がないとかで
書き込みできなかったりするので一度確認してみてはどうでしょうか?

==>フォルダのプロパティのセキュリティタブで設定できます。
画像を添付します。

==>なぜか画像がアップできないorz ので
==>フォルダのセキュリティタブの「編集」ボタン押下
->「ユーザまたはグループの追加」画面の「詳細」ボタン押下
-> 「検索」ボタン押下
->IIS_IUSRSを選択して追加

※WEBアプリケーションで出力したPDFを格納するフォルダを全然違う場所に保存するときに
この設定を行いました。
※ちなみにWEBアプリ本体が入っているフォルダのセキュリティにはPool名(例えば、DefaultPool)とかに
なっていると思います。
以上

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/03 10:53

    > ログ出力先の権限にIISユーザの書き込み権限がないとかで書き込みできなかったりするので一度確認してみてはどうでしょうか?

    そこのところをもっと具体的に、どこをどのように確認すればよいか教えていただけませんか?

    キャンセル

  • 2017/09/03 14:30

    回答に追記しました。

    キャンセル

  • 2017/09/03 15:25

    対応ありがとうございました。

    IIS_IUSRS というのは IIS のワーカープロセスが属するグループですね。(ワーカープロセスのトークンに対して実行時に IIS_IUSRS メンバーシップが自動的に追加される) だから、cutedog さんのケースで、IIS_IUSRS に「PDFを格納するフォルダ」に対する適切なアクセス権を与えることによってうまくいったのだと理解しています。

    ただ、質問者さんのケースでは「クラス名、メソッド名以外は両方とも正常に出力されています」とのことですから、ワーカープロセスのログフォルダに対する書き込み権限の問題ではなさそうな気がします。

    クラス名、メソッド名を取得するところに問題があるようです。と言って、それが何だかは、今提供されている情報では A, B 何が違うのか全く不明なので、自分は想像さえつきませんが。

    キャンセル

  • 2017/09/04 14:37

    回答ありがとうございます。
    権限について確認しましたが、問題なさそうです。
    少し前進というか記載内容に誤りがありましたので訂正させて下さい。
    >ビルドオプションなどを変えてはいないはずなのですが原因がわかりません。
    csprojファイルを新旧で比べた結果、新の方ではコードの最適化オプションにチェックが入っていました。
    これを外すと環境Aでも正常に出力されました。
    ただ、やはり環境A,Bで出力が違った原因はわからないままです。

    最適化されたコードだとクラス名、メソッド名が変わる?のかと思ったのですが
    それだと環境Bでも同じ出力になってほしいのですが・・・

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9267questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    634questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • IIS

    214questions

    IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。