Jon Heyman of CBSSports.com reports the contract includes an option for a fifth year.
Santana, who turns 32 on Friday, spent last season with the Braves. He had a 14-10 record with a 3.95 ERA and struck out 179 batters in 196 innings.
Santana played his first eight seasons with the Angels, before being traded to the Royals after the 2012 season. He spent one season in Kansas City and signed a one-year, $14 million deal with the Braves prior to last season.
Santana will join a Minnesota pitching staff which had the second-highest combined ERA in baseball last season, and the highest when adjusted for park factors.
- Dan Gartland