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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

IIS

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

ASP.NET

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

Q&A

解決済

2回答

3635閲覧

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

andkirato

総合スコア7

C#

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

IIS

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

ASP.NET

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

0グッド

0クリップ

投稿2017/08/30 14:35

編集2017/09/05 09:03

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

環境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でも一部のページのみ正常に出力されます。

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/30 16:33

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

2017/08/31 00:42

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

退会済みユーザー

2017/08/31 06:27

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

回答2

0

ベストアンサー

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

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

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

投稿2017/09/05 09:18

shimitei

総合スコア799

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

andkirato

2017/09/06 04:02

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

2017/09/06 05:23

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

2017/09/07 00:26

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

0

こんにちは。

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

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

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

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

投稿2017/09/02 10:13

編集2017/09/03 05:33
cutedog

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/03 01:53

> ログ出力先の権限にIISユーザの書き込み権限がないとかで書き込みできなかったりするので一度確認してみてはどうでしょうか? そこのところをもっと具体的に、どこをどのように確認すればよいか教えていただけませんか?
cutedog

2017/09/03 05:30

回答に追記しました。
退会済みユーザー

退会済みユーザー

2017/09/03 06:25

対応ありがとうございました。 IIS_IUSRS というのは IIS のワーカープロセスが属するグループですね。(ワーカープロセスのトークンに対して実行時に IIS_IUSRS メンバーシップが自動的に追加される) だから、cutedog さんのケースで、IIS_IUSRS に「PDFを格納するフォルダ」に対する適切なアクセス権を与えることによってうまくいったのだと理解しています。 ただ、質問者さんのケースでは「クラス名、メソッド名以外は両方とも正常に出力されています」とのことですから、ワーカープロセスのログフォルダに対する書き込み権限の問題ではなさそうな気がします。 クラス名、メソッド名を取得するところに問題があるようです。と言って、それが何だかは、今提供されている情報では A, B 何が違うのか全く不明なので、自分は想像さえつきませんが。
andkirato

2017/09/04 05:37

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問