【.NET】Twitter APIを使って推しの画像に溺れたい④
こんにちは。
日本ダービーでワイド2点当てました🎯アスクビクターモアくんありがとう!!
イクイノックスは親父と同じく菊花賞取ってくれよ!!!
今回は設定関連です。
ちょっと味気ないですが、もしかしたら同じ悩みを持っている人がいるかもしれないので...ね?
更新(2023/02/07)
設定値をクラスにバインドしていましたが、不要になったため実装を撤去しました。
下記の通りキー名から取得する方式に切り替えました。
それにより内容が少なくなったため、ログ出力を追加しました。
設定ファイル作成&読み込み
ここは大して派手な内容ではないので、サラっと終わらせます。
参考サイト
パッケージ追加
- Microsoft.Extension.Configuration
- Microsoft.Extension.Configuration.Binder
- Microsoft.Extension.Configuration.Json
設定内容
以下ファイルをプロジェクト直下に配置します。
{
"ApiKey": "AAA",
"ApiKeySecret": "BBB",
"AccessToken": "CCC",
"AccessTokenSecret": "DDD"
}
appsettings.jsonをビルドディレクトリに追加
VisualStudioで、appsettings.jsonを右クリックしプロパティを開きます。
右下に出てくるプロパティウィンドウで、「出力ディレクトリにコピー」に「常にコピーする」を選びます。
VSCode使ってて「そんなメニューねぇよ!」って場合は、csprojファイルを直接書き換えることもできます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.1" />
<PackageReference Include="TweetinviAPI" Version="5.0.4" />
</ItemGroup>
+ <ItemGroup>
+ <None Update="appsettings.json">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
</Project>
設定呼び出し
static async Task Main(string[] args)
{
// IConfigurationクラスで取得できます
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
// GetValue<T>で設定値を取得できます
TwitterClient userClient = new(
configuration.GetValue<string>("ApiKey"),
configuration.GetValue<string>("ApiKeySecret"),
configuration.GetValue<string>("AccessToken"),
configuration.GetValue<string>("AccessTokenSecret")
);
// ...
}
NLogでログ出力
デバッグ時はよくConsole.WriteLine
で出力させますが、稼働開始したとき標準出力はちょっと心もとないです。
そこでログ出力のライブラリの力を借りて、稼働後でも綺麗なログを出せるようにします。
参考サイト
パッケージ追加
- NLog
NLogの設定ファイル作成
プロジェクト直下にnlog.config
を作成します。
参考サイトではNLog.config
となっていますが、公式サイトでは全て小文字で命名するように指示されています。
そしてappsettings.json
と同様に、出力ディレクトリにコピーを「常にコピーする」にします。
中身は参考サイトのものをそのままお借りします。
NLogViewerは使わないので、Viewer用の設定は削除してあります。
ひとまず開発中はこのまま使用して、デプロイ時に書き換えようと思います。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="../logs/nlog_internal.log">
<targets>
<!-- ファイル -->
<target name="logFile"
xsi:type="File"
encoding="UTF-8"
writeBom="true"
lineEnding="Default"
layout="${longdate} ${level:uppercase=true:padding=-5} [${threadid}] ${logger} - ${message} ${exception:format=tostring}"
fileName="../logs/${processname}.log"
archiveFileName="../logs/backup/${processname}_{###}.log"
archiveEvery="Day"
archiveNumbering="Sequence"
maxArchiveFiles="100" />
<!-- Console -->
<target name="console" xsi:type="ColoredConsole" layout="${longdate} ${level:uppercase=true:padding=-5} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logFile" />
<logger name="*" minlevel="Trace" writeTo="console" />
</rules>
</nlog>
ログ出力
Program.csのトップでロガーを呼び出します。
internal class Program
{
private static Logger logger = LogManager.GetCurrentClassLogger();
private static async Task Main(string[] args)
{
// ...
}
}
ログレベルは5段階から選べます。
◯谷学院の個別指導に比べたら大したことないですね。
こんな感じで出力されます。
色をつけてくれるところがロガーの強みですね。
ただまぁテキストファイルに書き出したら色はつかないので、NLogViewer用の出力も作るか、ログテキストをVSCodeで見るかすれば着色できるかもしれないです。
次回
画像を一括で保存するところまで実装します。
ここまでできればひとまず完成となります。
Discussion